Исходник [RakSamp Lite] AimSync FIX

Leatington

Фанат Рейзора
263
75
А почему в math.randomseed используется os.clock()? Он возвращает время с момента запуска скрипта, поэтому рандомизация через него выглядит странным, числа будут повторяться постоянно, существует же os.time().
 

Ulong

Диванный критик
Автор темы
Проверенный
82
458
А почему в math.randomseed используется os.clock()? Он возвращает время с момента запуска скрипта, поэтому рандомизация через него выглядит странным, числа будут повторяться постоянно, существует же os.time().
os.clock() обеспечивает более уникальные значения если речь идёт про запуск нескольких копий приложения одновременно
DSqLsvb.png


если очень необходимо чтобы seed было "уникальным", то можно, к примеру, через ffi получать id процесса и использовать его для рандомизации
Lua:
local ffi = require("ffi")
local kernel32 = ffi.load("kernel32")
ffi.cdef[[
    typedef unsigned long DWORD;
    DWORD GetCurrentProcessId();
]]
local procID = kernel32.GetCurrentProcessId()
math.randomseed(procID)

ну а лучше всего комбинировать разные значения
 

Ulong

Диванный критик
Автор темы
Проверенный
82
458
Обновление 1.1

Текущий фикс закрывает базовые методы детекта https://www.blast.hk/threads/242284/
Бонусом исправление для SPECTATOR_SYNC: обновление позиции, отправка аим синхры, специально для параноиков реализована возможность вручную задать frontVec (менять в custom_spec_front)
Ну и плюс остальные мелкие дополнения
 

Ulong

Диванный критик
Автор темы
Проверенный
82
458
Обновление 1.2

Скорее просто косметическое обновление, которое ни на что не влияет.
Изменены рейты отправки пакета SPECTATOR_SYNC (100ms)
Добавлена возможность вручную задать camPos при отправке синхры слежения




ВАЖНОЕ ЗАМЕЧАНИЕ ЕСЛИ ИСПОЛЬЗУЕТЕ СЛАПФИКСЫ/ПРОВЕРКИ НА СЛАП
Заметил лично, потом один челик написал про конфликт с использованием слапа. Проверка на слап просто банально не срабатывает.
Чтобы слап работал вместе с этим скриптом нужно сделать свою костыльную функцию получения позиции бота. Пример ниже:

Lua:
local sampev = require("samp.events")
local vector3d = require("vector3d")
require("addon")

local last_pos = vector3d(0, 0, 0)

function getLastPosition() return last_pos end

function sampev.onSetPlayerPos(position)
    local bot_last = getLastPosition() -- читаем текущие координаты бота этой функцией, используем вместо getBotPosition()
    if position.x == bot_last.x and position.y == bot_last.y and position.z > bot_last.z then
        -- грубый пример срабатывания слапа
        -- слап сработал, спасибо всем
        print("slap slap slap")
    end
end

function checkBotPos() -- сама функция, обновляет позицию каждые 100 мс и заносит координаты в переменную
    while true do
        last_pos = vector3d(getBotPosition())
        wait(100)
    end
end

function onLoad()
    newTask(checkBotPos) -- объявляем таск при загрузке
end

Так же можно в самом скрипте аимфикса при получении RPC_SCRSETPLAYERPOS делать задержку на 100 ms через таск и только после обрабатывать дальше код. В любом случае, это скорее всего последняя версия скрипта и обновлений уже не будет. Так что пишите костыли как вам угодно
 
Последнее редактирование:

rgnrz.

Новичок
14
0
Обновление 1.2

Скорее просто косметическое обновление, которое ни на что не влияет.
Изменены рейты отправки пакета SPECTATOR_SYNC (100ms)
Добавлена возможность вручную задать camPos при отправке синхры слежения




ВАЖНОЕ ЗАМЕЧАНИЕ ЕСЛИ ИСПОЛЬЗУЕТЕ СЛАПФИКСЫ/ПРОВЕРКИ НА СЛАП
Заметил лично, потом один челик написал про конфликт с использованием слапа. Проверка на слап просто банально не срабатывает.
Чтобы слап работал вместе с этим скриптом нужно сделать свою костыльную функцию получения позиции бота. Пример ниже:

Lua:
local sampev = require("samp.events")
local vector3d = require("vector3d")
require("addon")

local last_pos = vector3d(0, 0, 0)

function getLastPosition() return last_pos end

function sampev.onSetPlayerPos(position)
    local bot_last = getLastPosition() -- читаем текущие координаты бота этой функцией, используем вместо getBotPosition()
    if position.x == bot_last.x and position.y == bot_last.y and position.z > bot_last.z then
        -- грубый пример срабатывания слапа
        -- слап сработал, спасибо всем
        print("slap slap slap")
    end
end

function checkBotPos() -- сама функция, обновляет позицию каждые 100 мс и заносит координаты в переменную
    while true do
        last_pos = vector3d(getBotPosition())
        wait(100)
    end
end

function onLoad()
    newTask(checkBotPos) -- объявляем таск при загрузке
end

Так же можно в самом скрипте аимфикса при получении RPC_SCRSETPLAYERPOS делать задержку на 100 ms через таск и только после обрабатывать дальше код. В любом случае, это скорее всего последняя версия скрипта и обновлений уже не будет. Так что пишите костыли как вам угодно

slapFIx.lua:
-- slapFix.lua - Исправленная версия с API для костыля

local sampev = require("samp.events")
require("addon")

-- Глобальные переменные (в _G)
_G.mode = 2
_G.state = 0
_G.x2, _G.y2, _G.z2 = 0, 0, 0
_G.x, _G.y, _G.z = 0, 0, 0
local speedv = -0.07
local b = 0

local need_speed = false
local need_speed_f = false

-- Эта функция будет вызываться извне (из slap_bridge.lua)
rawset(_G, "triggerSlap", function()
    if _G.mode == 2 then
        print("Slapped (via API)")
        _G.x2, _G.y2, _G.z2 = getBotPosition()
        _G.state = 1
    elseif _G.mode == 1 then
        print("Ignore slap (mode 1)")
    end
end)

function FailBot()
    if _G.state == 1 then
        if _G.z2 ~= _G.z then
            if _G.z2 >= _G.z then _G.z = _G.z2 end
                _G.z = _G.z + speedv
                need_speed_f = true
                setBotPosition(_G.x, _G.y, _G.z)
                updateSync()
                need_speed_f = false
            if _G.z2 >= _G.z then
                b = _G.x2 + 1
                speedv = -0.1
                setBotPosition(_G.x2, _G.y2, _G.z2)
                updateSync()
                _G.state = 2
            end
        end
    end
    if _G.state == 2 then
        if _G.x2 <= b then
            _G.x2 = _G.x2 + 0.2
            need_speed = true
            setBotPosition(_G.x2, _G.y2, _G.z2)
            updateSync()
            need_speed = false
        else
            _G.state = 0
        end
    end
end

function sampev.onSendPlayerSync(data)
    if need_speed == true then data.moveSpeed.z = 0.05 end
    if need_speed_f == true then
        local spz = speedv / 5
        data.moveSpeed.z = spz
        speedv = speedv - 0.8
        if speedv < -0.8 then
            speedv = -0.8
        end
    end
end

function onRunCommand(cmd)
    local args = {}
    for arg in cmd:gmatch("%S+") do
        table.insert(args, arg)
    end

    if args[1] == '!slapmode' then
        local arg = args[2]
        if arg == nil then
            print('Select mode: 1 - if you stay afk | 2 - for emulate slap')
            return false
        end
        if arg == "1" or arg == "2" then
            _G.mode = tonumber(arg)
            print("Current mode - "..arg)
        else
            print('Select mode: 1 - if you stay afk | 2 - for emulate slap')
        end
        return false
    end
end

function onLoad()
    newTask(function()
        while true do
            FailBot()
            wait(90)
        end
    end)
end

function sampev.onSetPlayerPos(pos)
    _G.x = pos.x
    _G.y = pos.y
    _G.z = pos.z
    local px, py, pz = getBotPosition()
    if px == _G.x and py == _G.y and pz ~= _G.z and _G.state == 0 then
        if _G.mode == 2 then
            print("Slapped")
            _G.x2, _G.y2, _G.z2 = getBotPosition()
            _G.state = 1
        elseif _G.mode == 1 then
            print("Ignore slap")
            return false
        end
    end
end

-- Для отладки
print("DEBUG: mode =", _G.mode)
print("DEBUG: state =", _G.state)
print("DEBUG: triggerSlap =", type(rawget(_G, "triggerSlap")))

-- Принудительно записываем функцию в _G (если она не была)
if not rawget(_G, "triggerSlap") then
    rawset(_G, "triggerSlap", function()
        print("triggerSlap called from _G")
        if _G.mode == 2 then
            _G.x2, _G.y2, _G.z2 = getBotPosition()
            _G.state = 1
        end
    end)
end

slapBridge:
-- slap_bridge.lua - Костыль, вызывающий функцию из slapFix.lua

require("addon")

local last_z = 0
local SLAP_THRESHOLD = 2.0
local slapfix_ready = false

function checkSlapAndTrigger()
    -- Ждём 2 секунды, чтобы все скрипты загрузились
    wait(2000)

    while true do
        if isBotSpawned() then
            local _, _, z = getBotPosition()
            if z then
                if last_z == 0 then
                    last_z = z
                else
                    local delta = z - last_z
                    if delta > SLAP_THRESHOLD and (not _G.state or _G.state == 0) then
                        -- Проверяем, есть ли функция triggerSlap в _G
                        if type(rawget(_G, "triggerSlap")) ~= "function" then
                            if not slapfix_ready then
                                print("slapFix not ready! Waiting...")
                                slapfix_ready = true
                            end
                            wait(1000)
                            goto continue
                        end

                        -- Вызываем функцию из slapFix.lua
                        print("Triggering slap via API")
                        rawget(_G, "triggerSlap")()
                    end
                    last_z = z
                end
            end
        else
            last_z = 0
        end

        ::continue::
        wait(90)
    end
end

function onLoad()
    newTask(checkSlapAndTrigger)
end

print("slap_bridge.lua loaded")
print("DEBUG: triggerSlap =", type(rawget(_G, "triggerSlap")))

Screenshot 2025-12-21 002702.png



В RakBot Lite каждый скрипт имеет СВОЁ собственное окружение (env), и даже _G — не единый глобальный объект, а локальная копия для каждого скрипта.

➡️ Это означает:
Запись в _G из одного скрипта — недоступна в другом, даже через rawset

Как не крути не лучше все в один файл???
 
Последнее редактирование: