Софт RakSAMP Lite

F0RQU1N and

Известный
1,310
495
Да, можно, если не через пакет, так через текст в консоли (сегодня посмотрю, если получится - скину код)

upd: Вот код, хз какой пакет приходит
Lua:
local ffi = require("ffi")


--HOOKS
local hook = {hooks = {}}
registerHandler("onUnload", function()
    for i, hook in ipairs(hook.hooks) do
        if hook.status then
            hook.stop()
        end
    end
end)
ffi.cdef [[
    int VirtualProtect(void* lpAddress, unsigned long dwSize, unsigned long flNewProtect, unsigned long* lpflOldProtect);
]]
function hook.new(cast, callback, hook_addr, size)
    jit.off(callback, true) --off jit compilation | thx FYP
    local size = size or 5
    local new_hook = {}
    local detour_addr = tonumber(ffi.cast("intptr_t", ffi.cast("void*", ffi.cast(cast, callback))))
    local void_addr = ffi.cast("void*", hook_addr)
    local old_prot = ffi.new("unsigned long[1]")
    local org_bytes = ffi.new("uint8_t[?]", size)
    ffi.copy(org_bytes, void_addr, size)
    local hook_bytes = ffi.new("uint8_t[?]", size, 0x90)
    hook_bytes[0] = 0xE9
    ffi.cast("uint32_t*", hook_bytes + 1)[0] = detour_addr - hook_addr - 5
    new_hook.call = ffi.cast(cast, hook_addr)
    new_hook.status = false
    local function set_status(bool)
        new_hook.status = bool
        ffi.C.VirtualProtect(void_addr, size, 0x40, old_prot)
        ffi.copy(void_addr, bool and hook_bytes or org_bytes, size)
        ffi.C.VirtualProtect(void_addr, size, old_prot[0], old_prot)
    end
    new_hook.stop = function() set_status(false) end
    new_hook.start = function() set_status(true) end
    new_hook.start()
    table.insert(hook.hooks, new_hook)
    return setmetatable(new_hook, {
        __call = function(self, ...)
            self.stop()
            local res = self.call(...)
            self.start()
            return res
        end
    })
end
--HOOKS

local originalErrorClientJoin


function errorClientJoin(...)
    print("errorClientJoin")
    return originalErrorClientJoin(...)
end


originalErrorClientJoin = hook.new(
    "void*(__cdecl*)(void*)",
    errorClientJoin, 0x459550
)
А нахуя? Там разве память под протекцией?
 
  • Нравится
Реакции: хуега)

tfornik

Известный
314
229
при вызове runCommand('!reloadlua') - крашит раксамп
есть рабочее решение?
 

sasha__1

Известный
27
12
Скажите плиз как можно сделать что бы бот зажимал W на несколько секунд?
Lua:
local hook = require("samp.events")
require("addon")

function pressKey(keyId, pressTime)
    print('Pressed key:', keyId)
    key = keyId
    press = true
    newTask(function()
        press = nil
        key = nil
    end, pressTime)
end

function hook.onSendPlayerSync(data)
    if pressKey then
        data.upDownKeys = key
    end
end

function onRunCommand(cmd)
    if cmd:find("^!pkey %d+ %d+$") then
        local _k, _t = cmd:match("^!pkey (%d+) (%d+)$")
        pressKey(tonumber(_k), tonumber(_t))
        return false
    end
end

function hook.onSendPlayerSync(data)
    if press then
        data.upDownKeys = key
    end
end

Вводишь в консоль "!pkey 65408 2000", и бот на две секунды зажмёт клавишу "W".
(Если введёшь 128 вместо 65408, то зажмёт клавишу "S")

Можно еще просто в коде:
Lua:
pressKey(65408, 2000)

Со стороны будет выглядеть так, будто ты идёшь на месте. Если тебе нужно прямо пройтись, а не зажать кнопку, то придётся писать более объёмный скрипт.

при вызове runCommand('!reloadlua') - крашит раксамп
есть рабочее решение?
Смотря для какой цели. Если для разработки, то можно просто перезапускать RakSamp. Да, ошибка присутствует. Краша пока что не избежать, насколько мне известно. Если ты пишешь бота и хочешь быстро очистить все переменные во время реконнект и/или дисконнекта, то сохраняй все данные в таблицу, а потом пересоздай эту таблицу.
Пример:

Lua:
local hook = require("samp.events")

bot = {}

function onLoad()
    bot.nickname = "Nick_Name"
    bot.password = "123123"
end

function hook.onSetPlayerPos(pos)
    bot.position = pos
end

-- Очищаем во время дисконнекта
function onDisconnect()
    bot = {}
end
 
Последнее редактирование:
  • Влюблен
Реакции: Жоский поцик

Жоский поцик

Участник
113
14
Lua:
local hook = require("samp.events")

function pressKey(keyId, pressTime)
    key = keyId
    pressKey = true
    newTask(function()
        pressKey = nil
        key = nil
    end, pressTime)
end


function hook.onSendPlayerSync(data)
    if pressKey then
        data.upDownKeys = key
    end
end

function onRunCommand(cmd)
    if cmd:find("^!pkey %d+ %d+$") then
        local _k, _t = cmd:match("^!pkey (%d+) (%d+)$")
        pressKey(tonumber(_k), tonumber(_t))
        return false
    end
end

Вводишь в консоль "!pkey 65408 2000", и бот на две секунды зажмёт клавишу "W".
(Если введёшь 128 вместо 65408, то зажмёт клавишу "S")

Можно еще просто в коде:
Lua:
pressKey(65408, 2000)

Со стороны будет выглядеть так, будто ты идёшь на месте. Если тебе нужно прямо пройтись, а не зажать кнопку, то придётся писать более объёмный скрипт.
Сначало, как зашёл, написало что loaded, как reqspawn*улся - начало каждую секунду флудить этим, что делать?
1691329447271.png
 

TuHku BuHKu

Участник
131
22
С чем может быть связана проблема подключения РакСампа, а именно допусстим бот сдох от голода, попал в больку вылечился сработал скрипт реконект после лечения через 15 сек, проходит 15 сек появляется надпись конект и дальше строки не идут, а иногда идут нормально, и в итоге я не пойму почему раз через раз он подключается то нормально то нет, пробовал даже сток РакСампа, и тоже самое раз через раз подключается то нормально то нет.

Screenshot_6.png


вот на этой строке он застывает и все, дальше не конектится
 
Последнее редактирование:

tfornik

Известный
314
229
так , чуваки
как перезагружать то скрипт?
я целый день роюсь по всему инету
runCommand('!reloadlua') просто крашит
 

хромиус)

спокойно, это всего лишь слива
Друг
4,958
3,231
так , чуваки
как перезагружать то скрипт?
я целый день роюсь по всему инету
runCommand('!reloadlua') просто крашит
как ответили выше,смотря от ситуации,если у тебя крашит скрипт со временем,нужно смотреть и исправлять,в противном случае как-то на костылях поддерживать состояние скрипта
 

хромиус)

спокойно, это всего лишь слива
Друг
4,958
3,231
всем привет,пытаюсь переделать эти функи под раксамп,и столкнулся с тем,что либо они не работают там,либо я чего-то натворил,подскажите что не так?
сами функции

Lua:
require("addon")


function onRunCommand(cmd)
    if cmd == '!kakawka' then
        newTask(function()
            sendInput('/phone')
            wait(2000)
            arizonaOpenPhoneApp(24)
        end)
    end
end

function arizonaOpenPhoneApp(appId)
    local str = ('launchedApp|%s'):format(appId)
    local bs = bitStream.new()
    bs:writeUInt8(220)
    bs:writeInt8(18)
    bs:writeInt8(#str)
    bs:writeInt8(0)
    bs:writeInt8(0)
    bs:writeInt8(0)
    bs:writeString(str)
    bs:writeInt32(0)
    bs:writeInt8(0)
    bs:writeInt8(0)
    bs:sendPacketEx(1, 7, 1)
    bs:reset()
end
function onReceivePacket(id, bs)
    if id == 220 then
        bs:ignoreBits(8)
        if (bs:readInt8(bs) == 17) then
            bs:ignoreBits(32)
            local text = bs:readString(bs:readInt32(bs))
            if text:find('window%.executeEvent%(\'event%.setActiveView\', \'%["Phone"%]\'%);') then
                newTask(arizonaOpenPhoneApp(26))
            end
        end
    end
end
 

sasha__1

Известный
27
12
всем привет,пытаюсь переделать эти функи под раксамп,и столкнулся с тем,что либо они не работают там,либо я чего-то натворил,подскажите что не так?
сами функции

Lua:
require("addon")


function onRunCommand(cmd)
    if cmd == '!kakawka' then
        newTask(function()
            sendInput('/phone')
            wait(2000)
            arizonaOpenPhoneApp(24)
        end)
    end
end

function arizonaOpenPhoneApp(appId)
    local str = ('launchedApp|%s'):format(appId)
    local bs = bitStream.new()
    bs:writeUInt8(220)
    bs:writeInt8(18)
    bs:writeInt8(#str)
    bs:writeInt8(0)
    bs:writeInt8(0)
    bs:writeInt8(0)
    bs:writeString(str)
    bs:writeInt32(0)
    bs:writeInt8(0)
    bs:writeInt8(0)
    bs:sendPacketEx(1, 7, 1)
    bs:reset()
end
function onReceivePacket(id, bs)
    if id == 220 then
        bs:ignoreBits(8)
        if (bs:readInt8(bs) == 17) then
            bs:ignoreBits(32)
            local text = bs:readString(bs:readInt32(bs))
            if text:find('window%.executeEvent%(\'event%.setActiveView\', \'%["Phone"%]\'%);') then
                newTask(arizonaOpenPhoneApp(26))
            end
        end
    end
end
Lua:
newTask(arizonaOpenPhoneApp(26))
замени на
Lua:
newTask(arizonaOpenPhoneApp, 0, 26)
Вот так пишется правильно:
Lua:
newTask(функция, задержка, параметр1, параметр2, параметр3, ...)
И еще у тебя пишет, что команда не найдена. Чтобы избежать, добавь return false в onRunCommand() вот так:

Lua:
function onRunCommand(cmd)
    if cmd == '!kakawka' then
        newTask(function()
            sendInput('/phone')
            wait(2000)
            arizonaOpenPhoneApp(24)
        end)
        return false
    end
end
Какие еще проблемы? Конкретнее ошибки покажи
 
  • Нравится
Реакции: хромиус)