Leatington
Фанат Рейзора
- 263
- 75
А почему в math.randomseed используется os.clock()? Он возвращает время с момента запуска скрипта, поэтому рандомизация через него выглядит странным, числа будут повторяться постоянно, существует же os.time().
os.clock() обеспечивает более уникальные значения если речь идёт про запуск нескольких копий приложения одновременноА почему в math.randomseed используется os.clock()? Он возвращает время с момента запуска скрипта, поэтому рандомизация через него выглядит странным, числа будут повторяться постоянно, существует же os.time().
local ffi = require("ffi")
local kernel32 = ffi.load("kernel32")
ffi.cdef[[
typedef unsigned long DWORD;
DWORD GetCurrentProcessId();
]]
local procID = kernel32.GetCurrentProcessId()
math.randomseed(procID)
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
Обновление 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 - Исправленная версия с 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
-- 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")))
как этим пользоваться
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")))
Посмотреть вложение 283590
В RakBot Lite каждый скрипт имеет СВОЁ собственное окружение (env), и даже _G — не единый глобальный объект, а локальная копия для каждого скрипта.
➡️ Это означает:
Запись в _G из одного скрипта — недоступна в другом, даже через rawset
Как не крути не лучше все в один файл???
дайте пж слапфикс рабочий с этим аим фиксом, этот не робит
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")))
Посмотреть вложение 283590
В RakBot Lite каждый скрипт имеет СВОЁ собственное окружение (env), и даже _G — не единый глобальный объект, а локальная копия для каждого скрипта.
➡️ Это означает:
Запись в _G из одного скрипта — недоступна в другом, даже через rawset
Как не крути не лучше все в один файл???