Функция в биндере

Lance_Sterling

Известный
Автор темы
979
350
Версия MoonLoader
.026-beta
Как сделать функцию в биндере, типо чел написал {wait=100} и функция приняла аргумент - далее подождала 100 секунд, или как игрок укажет.

т.е как сделать чтоб текст бинда считывался, а функция принимала аргумент и делала то, что указал игрок
 
Решение
Lua:
local imgui = require('mimgui')
local ffi = require('ffi')

local window = imgui.new.bool(false)
local buff = imgui.new.char[4096]('')

imgui.OnInitialize(function()
    imgui.GetStyle().WindowPadding = imgui.ImVec2(5, 5)
end)

local frame = imgui.OnFrame(
    function() return window[0] end,
    function(this)
        local size, res = imgui.ImVec2(300, 300), imgui.ImVec2(getScreenResolution())
        imgui.SetNextWindowPos(imgui.ImVec2(res.x / 2, res.y / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
        imgui.SetNextWindowSize(size, imgui.Cond.FirstUseEver)
        if imgui.Begin('run code', window) then
            local size = imgui.GetWindowSize()
            imgui.InputTextMultiline('##code', buff, ffi.sizeof(buff)...

whyega52

Гений, миллионер, плейбой, долбаеб
Модератор
2,800
2,665
Как сделать функцию в биндере, типо чел написал {wait=100} и функция приняла аргумент - далее подождала 100 секунд, или как игрок укажет.

т.е как сделать чтоб текст бинда считывался, а функция принимала аргумент и делала то, что указал игрок
Те надо код из строки воспроизвести, если да, то юзай функцию load(string code)
 

Lance_Sterling

Известный
Автор темы
979
350
Те надо код из строки воспроизвести, если да, то юзай функцию load(string code)
Неа, бро, заданные значения только, не это типо
Чел написал {wait=100} и хоть бы как название функции, мне главное - чтобы она принимала аргументы с строки
 

joumey

Активный
195
44
Неа, бро, заданные значения только, не это типо
Чел написал {wait=100} и хоть бы как название функции, мне главное - чтобы она принимала аргументы с строки
мб через match?

Lua:
text = 'Я сказал. {wait=1000} Я говорил.'
if text:find('.*{.+}.*') then
 command, arg = text:match('.*{(.+)=(.+)}.*')
 print(command..arg)
end
 

Lance_Sterling

Известный
Автор темы
979
350
мб через match?

Lua:
text = 'Я сказал. {wait=1000} Я говорил.'
if text:find('.*{.+}.*') then
 command, arg = text:match('.*{(.+)=(.+)}.*')
 print(command..arg)
end
была мысль, но как то выглядит не очень(govnocode)
ищу другие способы
 
  • Грустно
Реакции: joumey

Vespan

Чешский луашер
Проверенный
2,123
1,731
Lua:
lua_thread.create(function()--функция должна быть в потоке
    --TEXT - текст биндера
   
    if TEXT:find('^%{wait%=%d+%}%s+%}$') then
        local w = tonumber(TEXT:find('^%{wait%=(%d+)%}%s+%}$'))
        wait(w--[[если надо 1 - 1 секунда то *1000]])
        --code

    end

Lua:
local text = [[
123
w1500
456
]]
--
function bind(t)
    for l in t:gmatch('[^\n]+') do
        if l:find('^w%d+%s+$') then
            wait(tonumber(l:match('^w(%d+)%s+$')))
        end
            sampSendChat(l)
    end
end
--using-
lua_thread.create(bind,text)
 
  • Грустно
Реакции: Lance_Sterling

Lance_Sterling

Известный
Автор темы
979
350
Те надо код из строки воспроизвести, если да, то юзай функцию load(string code)
Lua:
                                for line in binder[k].TEXT:gmatch('[^\n]+') do
                                    if binder[k] then
                                        if not line:find('{.+%(.+%)}') then
                                            sampSendChat(u8:decode(line):gsub('{%w+}', tagsBinder))
                                            wait(binder[k].DELAY)
                                        else
                                            load(tostring(line:match('{(.+)}')))
                                        end
                                    else
                                        return
                                    end
                                end
1682773520994.png

не работает
 

chapo

чопа сребдс // @moujeek
Модератор
8,934
11,704

whyega52

Гений, миллионер, плейбой, долбаеб
Модератор
2,800
2,665
Lua:
                                for line in binder[k].TEXT:gmatch('[^\n]+') do
                                    if binder[k] then
                                        if not line:find('{.+%(.+%)}') then
                                            sampSendChat(u8:decode(line):gsub('{%w+}', tagsBinder))
                                            wait(binder[k].DELAY)
                                        else
                                            load(tostring(line:match('{(.+)}')))
                                        end
                                    else
                                        return
                                    end
                                end
Посмотреть вложение 199668
не работает
load() возвращает значение, типа function
1682773812514.png

- f будет одинакова, что в первом случае, что во втором.
Lua:
load("print(\"test\")")() -- вызовется сразу

local f = load("print(\"test\")")
f() -- только после того, как вызовешь f
 

Lance_Sterling

Известный
Автор темы
979
350

chapo

чопа сребдс // @moujeek
Модератор
8,934
11,704
  • Вау
Реакции: Lance_Sterling

Lance_Sterling

Известный
Автор темы
979
350
Lua:
local userCode = [[
var = 1
print(var)
]]

local status, result = pcall(loadstring, userCode)
if status then
    result()
else
    print('ОШИБКА:', result)
end
У меня. Так и есть

Lua:
local userCode = [[
var = 1
print(var)
]]

local status, result = pcall(loadstring, userCode)
if status then
    result()
else
    print('ОШИБКА:', result)
end
Алио помоги пжпж
 
Последнее редактирование:

chapo

чопа сребдс // @moujeek
Модератор
8,934
11,704
Lua:
local imgui = require('mimgui')
local ffi = require('ffi')

local window = imgui.new.bool(false)
local buff = imgui.new.char[4096]('')

imgui.OnInitialize(function()
    imgui.GetStyle().WindowPadding = imgui.ImVec2(5, 5)
end)

local frame = imgui.OnFrame(
    function() return window[0] end,
    function(this)
        local size, res = imgui.ImVec2(300, 300), imgui.ImVec2(getScreenResolution())
        imgui.SetNextWindowPos(imgui.ImVec2(res.x / 2, res.y / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
        imgui.SetNextWindowSize(size, imgui.Cond.FirstUseEver)
        if imgui.Begin('run code', window) then
            local size = imgui.GetWindowSize()
            imgui.InputTextMultiline('##code', buff, ffi.sizeof(buff), imgui.ImVec2(size.x - 10, size.y - imgui.GetCursorPosY() - 5 - 24 - 5))
            if imgui.Button('RUN', imgui.ImVec2(size.x - 10, 24)) then
                local status, result = pcall(loadstring(ffi.string(buff)))
                sampAddChatMessage(status and 'Done!' or 'Error running code: '..result, status and 0xFF00ff00 or 0xFFff0000)
            end
            imgui.End()
        end
    end
)

function main()
    while not isSampAvailable() do wait(0) end
    sampRegisterChatCommand('runlua', function()
        window[0] = not window[0]
    end)
    wait(-1)
end
1682840939688.png
 
  • Нравится
Реакции: Rice.