Lua [RakBot] OnFoot/InCar Route Recording System

Gafask

Участник
137
13
OnFoot/InCar Route Recording System

Из названия темы понятно, что скрипт предназначен для записи маршрутов в программе RakBot. Знаю, что в комплекте с ракботом уже идет SF плагин для записи OnFoot маршрутов, но я сделал свою, просто потому что я могу. Но, почему то, я ни разу не видел на просторах данного форума ботов с записанными InCar маршрутами, поэтому решил выложить скрипт, над которым работал около полугода, но всерьёз занялся им только позавчера.

Как с этим работать?

Запись маршрутов производится в клиенте игры, для этого предназначен lua скрипт, который надо кинуть в папку moonloader. Для начала процесса записи маршрута введите команду /rec [имя файла] и в нижней части экрана появятся цифры, которые обозначают число записанных пакетов. Записанные маршруты хранятся в папке rakbotRoutes, которая создается автоматически при первом запуске скрипта.
Воспроизводятся маршруты при помощи скрипта для RakBot, его нужно перенести в папку scripts. Чтобы воспроизвести маршрут необходимо перенести его в папку routes, которая находится в корне папки ракбота, после чего прописать команду !play [имя файла].
В обеих случаях название файла нужно вписывать без указания расширения.

В будущем я планирую добавить в скрипт для Moonloader интерфейс для дополнительных настроек, а так же будет доработать систему воспроизведения для RakBot скрипта. Реализация этого будет зависеть от реакции людей и общей востребованности этой затеи. На данный момент это своего рода демка, которая демонстрирует функционал обеих скриптов.
Особо заинтересованные люди могут подрезать себе системы записи/воспроизведения и строить на их базе свои боты. Разрешаю делать такое только с указанием источника механизма в виде этой темы!

ChangeLog:
Release (1.0)

1.1
Дальнейшего обновления функционала скрипта не будет, только фиксы ошибок! Запросы по типу "Сделай остановку на репорт/админа", "Сделай под бота автобусника" и им подобные будут отклоняться. Скрипт предназначен исключительно для записи маршрутов и их воспроизведения, а не для создания полноценных ботов с нужными для них функциями. Для этого есть другие программисты и я уверен, что с подобным они должны справиться. Именно для этого я сделал всё опенсурс и разрешил другим разработчикам использовать код в своих скриптах при указывании источника. Так-же в силу узкого функционала скрипта для Moonloader я решил не делать никаких гуи менюшек, ибо сам не представляю что туда можно всунуть. Думаю что две команды и клавиши можно использовать без нагрузки скрипта ImGui. Спасибо за внимание.
Зависимости (Moonloader):
SAMPFUNCS
Moonloader

Автор: Shamanije
Н
Норм вроде но добавь регулировку скорости маршрута , а то чото не пойму то бежит как пуля то бежит но быстрее обычного бомжа . Такой еще вопрос при перегрузку и прыках также двигается как хрен знает что и добавил бы остановку маршрута и запуск с тогоже места .
 

Thrill_Pill

Известный
315
108
Н
Норм вроде но добавь регулировку скорости маршрута , а то чото не пойму то бежит как пуля то бежит но быстрее обычного бомжа . Такой еще вопрос при перегрузку и прыках также двигается как хрен знает что и добавил бы остановку маршрута и запуск с тогоже места .
Остановка и запуск с 1 места есть в 1.1. А чтобы он бежал нормально измени custom на сток.
 

lynti4

Известный
14
1
Это то что я так давно искал, ты ГЕНИЙ, спасибо тебе огромное за то что ты делаешь годные вещи!!
 

EazyBoost

Известный
207
24
Можно бег к метке как-то записать, если она в разных точках появляется? Или отдельного бота делать только
 

Rei

Известный
Друг
1,610
1,667
Как можно сделать, чтобы после воспроизведения маршрута бот удерживал положение последнего записанного пакета? а то он просто встает и разворачивается той же стороной, что и был заресплен, еще и анимка сбивается
 

Shamanije

Известный
Автор темы
Друг
959
923
Как можно сделать, чтобы после воспроизведения маршрута бот удерживал положение последнего записанного пакета? а то он просто встает и разворачивается той же стороной, что и был заресплен, еще и анимка сбивается
в последней версии все это есть, кроме анимации
 

Shamanije

Известный
Автор темы
Друг
959
923
пробовал только что из шапки и из темы, один хер обратно разворачивается
setQuaternion(packet[counter].x, packet[counter].y, packet[counter].z)
после 141 строки вставь это. почему то думал что устанавливаю кватернион после каждого пакета, но оказалось что только при остановке маршрута командой
 

Rei

Известный
Друг
1,610
1,667
setQuaternion(packet[counter].x, packet[counter].y, packet[counter].z)
после 141 строки вставь это. почему то думал что устанавливаю кватернион после каждого пакета, но оказалось что только при остановке маршрута командой
Код:
[00:20:51] [LUA] playing route "zdls1". total length: 373
[00:20:51] [ERROR] Ошибка скрипта "RAKBOT route player.lua": caught (...) exception
[00:20:51] [ERROR] stack traceback:
[00:20:51] [ERROR]     [C]: in function 'setQuaternion'
[00:20:51] [ERROR]     ...чи 02.05\scripts\RAKBOT route player.lua:142: in function <...чи 02.05\scripts\RAKBOT route player.lua:78>
[00:20:51] [ERROR] Ошибка скрипта "RAKBOT route player.lua": caught (...) exception
[00:20:51] [ERROR] stack traceback:
[00:20:51] [ERROR]     [C]: in function 'setQuaternion'
[00:20:51] [ERROR]     ...чи 02.05\scripts\RAKBOT route player.lua:142: in function <...чи 02.05\scripts\RAKBOT route player.lua:78>
[00:20:51] [ERROR] Ошибка скрипта "RAKBOT route player.lua": caught (...) exception
[00:20:51] [ERROR] stack traceback:
[00:20:51] [ERROR]     [C]: in function 'setQuaternion'
[00:20:51] [ERROR]     ...чи 02.05\scripts\RAKBOT route player.lua:142: in function <...чи 02.05\scripts\RAKBOT route player.lua:78>
[00:20:51] [ERROR] Ошибка скрипта "RAKBOT route player.lua": caught (...) exception
[00:20:51] [ERROR] stack traceback:
[00:20:51] [ERROR]     [C]: in function 'setQuaternion'
[00:20:51] [ERROR]     ...чи 02.05\scripts\RAKBOT route player.lua:142: in function <...чи 02.05\scripts\RAKBOT route player.lua:78>

начали адски срать ошибками
 

Shamanije

Известный
Автор темы
Друг
959
923
Код:
[00:20:51] [LUA] playing route "zdls1". total length: 373
[00:20:51] [ERROR] Ошибка скрипта "RAKBOT route player.lua": caught (...) exception
[00:20:51] [ERROR] stack traceback:
[00:20:51] [ERROR]     [C]: in function 'setQuaternion'
[00:20:51] [ERROR]     ...чи 02.05\scripts\RAKBOT route player.lua:142: in function <...чи 02.05\scripts\RAKBOT route player.lua:78>
[00:20:51] [ERROR] Ошибка скрипта "RAKBOT route player.lua": caught (...) exception
[00:20:51] [ERROR] stack traceback:
[00:20:51] [ERROR]     [C]: in function 'setQuaternion'
[00:20:51] [ERROR]     ...чи 02.05\scripts\RAKBOT route player.lua:142: in function <...чи 02.05\scripts\RAKBOT route player.lua:78>
[00:20:51] [ERROR] Ошибка скрипта "RAKBOT route player.lua": caught (...) exception
[00:20:51] [ERROR] stack traceback:
[00:20:51] [ERROR]     [C]: in function 'setQuaternion'
[00:20:51] [ERROR]     ...чи 02.05\scripts\RAKBOT route player.lua:142: in function <...чи 02.05\scripts\RAKBOT route player.lua:78>
[00:20:51] [ERROR] Ошибка скрипта "RAKBOT route player.lua": caught (...) exception
[00:20:51] [ERROR] stack traceback:
[00:20:51] [ERROR]     [C]: in function 'setQuaternion'
[00:20:51] [ERROR]     ...чи 02.05\scripts\RAKBOT route player.lua:142: in function <...чи 02.05\scripts\RAKBOT route player.lua:78>

начали адски срать ошибками
 

Вложения

  • RAKBOT route player.lua
    5.4 KB · Просмотры: 42
  • Нравится
Реакции: Rei

Thrill_Pill

Известный
315
108
Что-то я туплю.. Так добавить запись train_speed ?
Lua:
function getIncarPacketData()
    local vehptr = allocateMemory(63)
    local _, pid = sampGetPlayerIdByCharHandle(PLAYER_PED)
    sampStorePlayerIncarData(pid, vehptr)
    pdata[counter] = {}
    pdata[counter].packetId = 200
    pdata[counter].lr = memory.getuint16(vehptr + 2)
    pdata[counter].ud = memory.getuint16(vehptr + 4)
    pdata[counter].keys = memory.getuint16(vehptr + 6)
    pdata[counter].qw = memory.getfloat(vehptr + 8)
    pdata[counter].qx = memory.getfloat(vehptr + 12)
    pdata[counter].qy = memory.getfloat(vehptr + 16)
    pdata[counter].qz = memory.getfloat(vehptr + 20)
    pdata[counter].x = memory.getfloat(vehptr + 24)
    pdata[counter].y = memory.getfloat(vehptr + 28)
    pdata[counter].z = memory.getfloat(vehptr + 32)
    pdata[counter].sx = memory.getfloat(vehptr + 36)
    pdata[counter].sy = memory.getfloat(vehptr + 40)
    pdata[counter].sz = memory.getfloat(vehptr + 44)
    pdata[counter].gear = memory.getuint8(vehptr + 56)
    pdata[counter].st = memory.getfloat(vehptr + 60)
    printStringNow(counter, 100)
    freeMemory(vehptr)
    counter = counter + 1
end
 

Shamanije

Известный
Автор темы
Друг
959
923
Что-то я туплю.. Так добавить запись train_speed ?
Lua:
    pdata[counter] = {}
    pdata[counter].packetId = 200
    pdata[counter].lr = memory.getuint16(vehptr + 2)
    pdata[counter].ud = memory.getuint16(vehptr + 4)
    pdata[counter].keys = memory.getuint16(vehptr + 6)
    pdata[counter].qw = memory.getfloat(vehptr + 8)
    pdata[counter].qx = memory.getfloat(vehptr + 12)
    pdata[counter].qy = memory.getfloat(vehptr + 16)
    pdata[counter].qz = memory.getfloat(vehptr + 20)
    pdata[counter].x = memory.getfloat(vehptr + 24)
    pdata[counter].y = memory.getfloat(vehptr + 28)
    pdata[counter].z = memory.getfloat(vehptr + 32)
    pdata[counter].sx = memory.getfloat(vehptr + 36)
    pdata[counter].sy = memory.getfloat(vehptr + 40)
    pdata[counter].sz = memory.getfloat(vehptr + 44)
    pdata[counter].gear = memory.getuint8(vehptr + 56)
    pdata[counter].st = memory.getfloat(vehptr + 60)
vehptr + 62
перед трэйнспидом находится еще поле trailerId
 
  • Нравится
Реакции: Thrill_Pill

Thrill_Pill

Известный
315
108
А произвожу запись вот так ?

Lua:
    if packet[counter].packetId == 200 and getBotState() == 2 then
            local bs = bitStreamNew()
            bitStreamWriteByte(bs, packet[counter].packetId)
            bitStreamWriteWord(bs, getBotVehicle())
            bitStreamWriteWord(bs, packet[counter].lr)
            bitStreamWriteWord(bs, packet[counter].ud)
            bitStreamWriteWord(bs, packet[counter].keys)
            bitStreamWriteFloat(bs, packet[counter].qw)
            bitStreamWriteFloat(bs, packet[counter].qx)
            bitStreamWriteFloat(bs, packet[counter].qy)
            bitStreamWriteFloat(bs, packet[counter].qz)
            bitStreamWriteFloat(bs, packet[counter].x)
            bitStreamWriteFloat(bs, packet[counter].y)
            bitStreamWriteFloat(bs, packet[counter].z)
            bitStreamWriteFloat(bs, packet[counter].sx)
            bitStreamWriteFloat(bs, packet[counter].sy)
            bitStreamWriteFloat(bs, packet[counter].sz)
            bitStreamWriteFloat(bs, veh[getBotVehicle()])
            bitStreamWriteByte(bs, getHealth())
            bitStreamWriteByte(bs, getArmour())
            bitStreamWriteByte(bs, getWeapon())
            bitStreamWriteByte(bs, 0)
            bitStreamWriteByte(bs, 0)
            bitStreamWriteByte(bs, packet[counter].gear)
            bitStreamWriteWord(bs, 0)
            bitStreamWriteFloat(bs, packet[counter].st)
            sendPacket(bs)
            counter = counter + 1
            bitStreamDelete(bs)
        end
 

Shamanije

Известный
Автор темы
Друг
959
923
А произвожу запись вот так ?

Lua:
    if packet[counter].packetId == 200 and getBotState() == 2 then
            local bs = bitStreamNew()
            bitStreamWriteByte(bs, packet[counter].packetId)
            bitStreamWriteWord(bs, getBotVehicle())
            bitStreamWriteWord(bs, packet[counter].lr)
            bitStreamWriteWord(bs, packet[counter].ud)
            bitStreamWriteWord(bs, packet[counter].keys)
            bitStreamWriteFloat(bs, packet[counter].qw)
            bitStreamWriteFloat(bs, packet[counter].qx)
            bitStreamWriteFloat(bs, packet[counter].qy)
            bitStreamWriteFloat(bs, packet[counter].qz)
            bitStreamWriteFloat(bs, packet[counter].x)
            bitStreamWriteFloat(bs, packet[counter].y)
            bitStreamWriteFloat(bs, packet[counter].z)
            bitStreamWriteFloat(bs, packet[counter].sx)
            bitStreamWriteFloat(bs, packet[counter].sy)
            bitStreamWriteFloat(bs, packet[counter].sz)
            bitStreamWriteFloat(bs, veh[getBotVehicle()])
            bitStreamWriteByte(bs, getHealth())
            bitStreamWriteByte(bs, getArmour())
            bitStreamWriteByte(bs, getWeapon())
            bitStreamWriteByte(bs, 0)
            bitStreamWriteByte(bs, 0)
            bitStreamWriteByte(bs, packet[counter].gear)
            bitStreamWriteWord(bs, 0)
            bitStreamWriteFloat(bs, packet[counter].st)
            sendPacket(bs)
            counter = counter + 1
            bitStreamDelete(bs)
        end
наверное, потести будет ли работать