Вопросы по Lua скриптингу

Общая тема для вопросов по разработке скриптов на языке программирования Lua, в частности под MoonLoader.
  • Задавая вопрос, убедитесь, что его нет в списке частых вопросов и что на него ещё не отвечали (воспользуйтесь поиском).
  • Поищите ответ в теме посвященной разработке Lua скриптов в MoonLoader
  • Отвечая, убедитесь, что ваш ответ корректен.
  • Старайтесь как можно точнее выразить мысль, а если проблема связана с кодом, то обязательно прикрепите его к сообщению, используя блок [code=lua]здесь мог бы быть ваш код[/code].
  • Если вопрос связан с MoonLoader-ом первым делом желательно поискать решение на wiki.

Частые вопросы

Как научиться писать скрипты? С чего начать?
Информация - Гайд - Всё о Lua скриптинге для MoonLoader(https://blast.hk/threads/22707/)
Как вывести текст на русском? Вместо русского текста у меня какие-то каракули.
Изменить кодировку файла скрипта на Windows-1251. В Atom: комбинация клавиш Ctrl+Shift+U, в Notepad++: меню Кодировки -> Кодировки -> Кириллица -> Windows-1251.
Как получить транспорт, в котором сидит игрок?
Lua:
local veh = storeCarCharIsInNoSave(PLAYER_PED)
Как получить свой id или id другого игрока?
Lua:
local _, id = sampGetPlayerIdByCharHandle(PLAYER_PED) -- получить свой ид
local _, id = sampGetPlayerIdByCharHandle(ped) -- получить ид другого игрока. ped - это хендл персонажа
Как проверить, что строка содержит какой-то текст?
Lua:
if string.find(str, 'текст', 1, true) then
-- строка str содержит "текст"
end
Как эмулировать нажатие игровой клавиши?
Lua:
local game_keys = require 'game.keys' -- где-нибудь в начале скрипта вне функции main

setGameKeyState(game_keys.player.FIREWEAPON, -1) -- будет сэмулировано нажатие клавиши атаки
Все иды клавиш находятся в файле moonloader/lib/game/keys.lua.
Подробнее о функции setGameKeyState здесь: lua - setgamekeystate | BlastHack — DEV_WIKI(https://www.blast.hk/wiki/lua:setgamekeystate)
Как получить id другого игрока, в которого целюсь я?
Lua:
local valid, ped = getCharPlayerIsTargeting(PLAYER_HANDLE) -- получить хендл персонажа, в которого целится игрок
if valid and doesCharExist(ped) then -- если цель есть и персонаж существует
  local result, id = sampGetPlayerIdByCharHandle(ped) -- получить samp-ид игрока по хендлу персонажа
  if result then -- проверить, прошло ли получение ида успешно
    -- здесь любые действия с полученным идом игрока
  end
end
Как зарегистрировать команду чата SAMP?
Lua:
-- До бесконечного цикла/задержки
sampRegisterChatCommand("mycommand", function (param)
     -- param будет содержать весь текст введенный после команды, чтобы разделить его на аргументы используйте string.match()
    sampAddChatMessage("MyCMD", -1)
end)
Крашит игру при вызове sampSendChat. Как это исправить?
Это происходит из-за бага в SAMPFUNCS, когда производится попытка отправки пакета определенными функциями изнутри события исходящих RPC и пакетов. Исправления для этого бага нет, но есть способ не провоцировать его. Вызов sampSendChat изнутри обработчика исходящих RPC/пакетов нужно обернуть в скриптовый поток с нулевой задержкой:
Lua:
function onSendRpc(id)
  -- крашит:
  -- sampSendChat('Send RPC: ' .. id)

  -- норм:
  lua_thread.create(function()
    wait(0)
    sampSendChat('Send RPC: ' .. id)
  end)
end
 
Последнее редактирование:

BANINI

Участник
63
3
Помогите пазязя

Пытался сделать чтобы в окне imgui данные обновлялись, но чего-то не выходит. Выдает такую ошибку:
[14:31:30.386274] (error) ChatLua.lua: D:\GTA 140K BY DAPO SHOW\moonloader\ChatLua.lua:42: attempt to concatenate global 'money' (a nil value)
stack traceback:
D:\GTA 140K BY DAPO SHOW\moonloader\ChatLua.lua:42: in function '_draw'
D:\GTA 140K BY DAPO SHOW\moonloader\lib\mimgui\init.lua:107: in function <D:\GTA 140K BY DAPO SHOW\moonloader\lib\mimgui\init.lua:91>
[14:31:30.386274] (error) ChatLua.lua: Script died due to an error. (1C89634C)
И так на каждую переменную :_(

Вот сам кривой код:

Кодик:
require "moonloader"
require "sampfuncs"
require "lib.moonloader"
encoding = require "encoding"
inicfg = require "inicfg"
encoding.default = "CP1251"
u8 = encoding.UTF8

local imgui = require 'mimgui'
local vkeys = require 'vkeys'
local memory = require 'memory'

local wm = require 'windows.message'

local new = imgui.new
local renderWindow = new.bool()
local sizeX, sizeY = getScreenResolution()

function update()
    lua_thread.create(function()
        while true do
            wait(100)
            
            _, myid = sampGetPlayerIdByCharHandle(PLAYER_PED) -- получение своего id (нужно, чтобы получить свой пинг)
            money = getPlayerMoney(myid) -- получаем кол-во денег
            ping = sampGetPlayerPing(myid) -- получаем пинг
            fps = memory.getfloat(0xB7CB50, true) -- получение фпс
            health,_draw = sampGetPlayerHealth(myid)
            nick = sampGetPlayerNickname(PLAYER_PED)
            
        end
    end)
end

local newFrame = imgui.OnFrame(
    function() return renderWindow[0] end,
    function(player)
        imgui.SetNextWindowPos(imgui.ImVec2(sizeX / 2, sizeY / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5)) -- Укажем положение окна по центру и выставим оффсет 0.5, чтобы рендер шёл от середины окна
        imgui.SetNextWindowSize(imgui.ImVec2(200, 150), imgui.Cond.FirstUseEver) -- Укажем размер
        imgui.Begin(u8"Оконо САМП", renderWindow)
        imgui.Text(u8"Хай! Ку-ку")
        imgui.Text(string.format(u8"хуй знает что это: %s", renderWindow[0]))
        imgui.Text(u8"Ваш ник: " ..nick)
        imgui.Text(u8"Денег: " ..money)
        imgui.Text(u8"Пинг: " ..ping)
        imgui.Text(u8"FPS: " ..fps)
        imgui.Text(u8"health: " ..health)
        imgui.End()
    end
)

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    
    addEventHandler('onWindowMessage', function(msg, wparam, lparam) -- Сама функция, в которой будем обрабатывать горячие клавиши. Обратите внимание, что данный способ является наиболее верным в плане оптимизации.
        if msg == wm.WM_KEYDOWN or msg == wm.WM_SYSKEYDOWN then -- Если клавиша нажата
            if wparam == vkeys.VK_X then -- И если это клавиша X
                renderWindow[0] = not renderWindow[0] -- Переключаем состояние рендера
            end
            update()
        end
    end)
    wait(-1)
end
 

pulemetov scripts

Участник
21
33
Помогите пазязя

Пытался сделать чтобы в окне imgui данные обновлялись, но чего-то не выходит. Выдает такую ошибку:
[14:31:30.386274] (error) ChatLua.lua: D:\GTA 140K BY DAPO SHOW\moonloader\ChatLua.lua:42: attempt to concatenate global 'money' (a nil value)
stack traceback:
D:\GTA 140K BY DAPO SHOW\moonloader\ChatLua.lua:42: in function '_draw'
D:\GTA 140K BY DAPO SHOW\moonloader\lib\mimgui\init.lua:107: in function <D:\GTA 140K BY DAPO SHOW\moonloader\lib\mimgui\init.lua:91>
[14:31:30.386274] (error) ChatLua.lua: Script died due to an error. (1C89634C)
И так на каждую переменную :_(

Вот сам кривой код:

Кодик:
require "moonloader"
require "sampfuncs"
require "lib.moonloader"
encoding = require "encoding"
inicfg = require "inicfg"
encoding.default = "CP1251"
u8 = encoding.UTF8

local imgui = require 'mimgui'
local vkeys = require 'vkeys'
local memory = require 'memory'

local wm = require 'windows.message'

local new = imgui.new
local renderWindow = new.bool()
local sizeX, sizeY = getScreenResolution()

function update()
    lua_thread.create(function()
        while true do
            wait(100)
           
            _, myid = sampGetPlayerIdByCharHandle(PLAYER_PED) -- получение своего id (нужно, чтобы получить свой пинг)
            money = getPlayerMoney(myid) -- получаем кол-во денег
            ping = sampGetPlayerPing(myid) -- получаем пинг
            fps = memory.getfloat(0xB7CB50, true) -- получение фпс
            health,_draw = sampGetPlayerHealth(myid)
            nick = sampGetPlayerNickname(PLAYER_PED)
           
        end
    end)
end

local newFrame = imgui.OnFrame(
    function() return renderWindow[0] end,
    function(player)
        imgui.SetNextWindowPos(imgui.ImVec2(sizeX / 2, sizeY / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5)) -- Укажем положение окна по центру и выставим оффсет 0.5, чтобы рендер шёл от середины окна
        imgui.SetNextWindowSize(imgui.ImVec2(200, 150), imgui.Cond.FirstUseEver) -- Укажем размер
        imgui.Begin(u8"Оконо САМП", renderWindow)
        imgui.Text(u8"Хай! Ку-ку")
        imgui.Text(string.format(u8"хуй знает что это: %s", renderWindow[0]))
        imgui.Text(u8"Ваш ник: " ..nick)
        imgui.Text(u8"Денег: " ..money)
        imgui.Text(u8"Пинг: " ..ping)
        imgui.Text(u8"FPS: " ..fps)
        imgui.Text(u8"health: " ..health)
        imgui.End()
    end
)

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
   
    addEventHandler('onWindowMessage', function(msg, wparam, lparam) -- Сама функция, в которой будем обрабатывать горячие клавиши. Обратите внимание, что данный способ является наиболее верным в плане оптимизации.
        if msg == wm.WM_KEYDOWN or msg == wm.WM_SYSKEYDOWN then -- Если клавиша нажата
            if wparam == vkeys.VK_X then -- И если это клавиша X
                renderWindow[0] = not renderWindow[0] -- Переключаем состояние рендера
            end
            update()
        end
    end)
    wait(-1)
end
ник достаточно получить один раз при загрузке скрипта
попробуй:
Lua:
в main:    nick = sampGetPlayerNickname(PLAYER_PED)

local newFrame = imgui.OnFrame(
    function() return renderWindow[0] end,
    function(player)
        imgui.SetNextWindowPos(imgui.ImVec2(sizeX / 2, sizeY / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5)) -- Укажем положение окна по центру и выставим оффсет 0.5, чтобы рендер шёл от середины окна
        imgui.SetNextWindowSize(imgui.ImVec2(200, 150), imgui.Cond.FirstUseEver) -- Укажем размер
        imgui.Begin(u8"Оконо САМП", renderWindow)
        imgui.Text(u8"Хай! Ку-ку")
        imgui.Text(string.format(u8"хуй знает что это: %s", renderWindow[0]))
        imgui.Text(u8"Ваш ник: " ..nick)
        imgui.Text(u8"Денег: " ..getPlayerMoney(select(2, sampGetPlayerIdByCharHandle(PLAYER_PED))))
        imgui.Text(u8"Пинг: " ..sampGetPlayerPing(select(2, sampGetPlayerIdByCharHandle(PLAYER_PED))))
        imgui.Text(u8"FPS: " ..memory.getfloat(0xB7CB50, true))
        imgui.Text(u8"health: " ..sampGetPlayerHealth(select(2, sampGetPlayerIdByCharHandle(PLAYER_PED))))
        imgui.End()
    end
)

либо
Код:
вне функций:
local money, ping, fps, health, nick
 

sat0ry

Известный
1,087
290
ахереть, че не так емае?(MIMGUI не путать с IMGUI)
ошибка:
[ML] (error) medhelper.lua: D:\Babetape_LetoGTA\moonloader\medhelper.lua:246: attempt to call method 'deocde' (a nil value)
stack traceback:
    D:\Babetape_LetoGTA\moonloader\medhelper.lua:246: in function 'save'
    D:\Babetape_LetoGTA\moonloader\medhelper.lua:100: in function '_draw'
    D:\Babetape_LetoGTA\moonloader\lib\mimgui\init.lua:102: in function <D:\Babetape_LetoGTA\moonloader\lib\mimgui\init.lua:86>
[ML] (error) medhelper.lua: Script died due to an error. (1502F95C)
Код:
code:
function save()
    ini.main.usetag = bool.usetag[0]
    ini.main.nickname = u8:decode(str(strg.NickName))
    ini.main.rank = u8:decode(str(strg.rank))
    ini.main.taginr = u8:deocde(str(strg.taginr)) -- та самая 246 строка на которой ошибка
    ini.main.org = int.organisation[0]
    ini.main.gender = int.gender[0]
    inicfg.save(ini, directIni)
end
 

ARMOR

kjor32 is legend
Модератор
4,846
6,100
ахереть, че не так емае?(MIMGUI не путать с IMGUI)
ошибка:
[ML] (error) medhelper.lua: D:\Babetape_LetoGTA\moonloader\medhelper.lua:246: attempt to call method 'deocde' (a nil value)
stack traceback:
    D:\Babetape_LetoGTA\moonloader\medhelper.lua:246: in function 'save'
    D:\Babetape_LetoGTA\moonloader\medhelper.lua:100: in function '_draw'
    D:\Babetape_LetoGTA\moonloader\lib\mimgui\init.lua:102: in function <D:\Babetape_LetoGTA\moonloader\lib\mimgui\init.lua:86>
[ML] (error) medhelper.lua: Script died due to an error. (1502F95C)
Код:
code:
function save()
    ini.main.usetag = bool.usetag[0]
    ini.main.nickname = u8:decode(str(strg.NickName))
    ini.main.rank = u8:decode(str(strg.rank))
    ini.main.taginr = u8:deocde(str(strg.taginr)) -- та самая 246 строка на которой ошибка
    ini.main.org = int.organisation[0]
    ini.main.gender = int.gender[0]
    inicfg.save(ini, directIni)
end
У тебя в 246 строчке deocde а не decode
 
  • Нравится
Реакции: sat0ry

krim

Известный
304
132
priority,reliability,orderingChannel за что отвечают эти параметры в битстриме
 

sat0ry

Известный
1,087
290
MIMGUI
Ошибок никаких нету, но после перезагрузки скрипт отказывается сохранять все то что было до перезагрузки в этих полях
code:
local inicfg = require 'inicfg'
local directIni = 'MedicalHelperLite.ini'
local ini = inicfg.load(inicfg.load({
    main = {
        nickname = '',
        rank = '',
        taginr = '',
        org = 0,
        gender = 0,
        usetag = false
    },
}, directIni))
inicfg.save(ini, directIni)
-- // local renderWindow = new.bool(false)
local bool = {
    usetag = new.bool(ini.main.usetag)
}

local strg = {
    NickName = new.char[256](u8:decode(ini.main.nickname)),
    rank = new.char[256](u8:decode(ini.main.rank)),
    taginr = new.char[256](u8:decode(ini.main.taginr))
}

local int = {
    organisation = new.int(ini.main.org),
    gender = new.int(ini.main.gender)
}

local newFrame = imgui.OnFrame(
    function() return renderWindow[0] end,
    function(self)
        local resX, resY = getScreenResolution()
        local sizeX, sizeY = 300, 300
        imgui.SetNextWindowPos(imgui.ImVec2(resX / 2, resY / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
        imgui.SetNextWindowSize(imgui.ImVec2(sizeX, sizeY), imgui.Cond.FirstUseEver)
        imgui.Begin('Medical Helper', renderWindow, imgui.WindowFlags.NoResize + imgui.WindowFlags.NoTitleBar)
            imgui.SetCursorPosX(500)
            imgui.CloseButton('CloseThisWindow', renderWindow, 25, 25)
            if imgui.CollapsingHeader(u8'Основная информация') then
                imgui.PushItemWidth(120)
                    if imgui.Combo(u8'Организация', int.organisation, ImOrg, #org) then save() end
                    imgui.SameLine()
                    imgui.SetCursorPosX(210)
                    if imgui.Checkbox(u8'Использовать тег в рацию', bool.usetag) then save() end
                    if imgui.InputText(u8'Имя и Фамилия', strg.NickName, 48) then save() end
                    if imgui.InputText(u8'Должность', strg.rank, 48) then save() end
                    if bool.usetag[0] then
                        imgui.InputText(u8'Тег в рацию', strg.taginr, 48)
                        save()
                    end
                    imgui.Combo(u8'Пол вашего персонажа', int.gender, ImGender, #gender)
                imgui.PopItemWidth()
        imgui.End()
    end
)

function save()
    ini.main.usetag = bool.usetag[0]
    ini.main.nickname = u8:decode(str(strg.NickName))
    ini.main.rank = u8:decode(str(strg.rank))
    ini.main.taginr = u8:decode(str(strg.taginr))
    ini.main.org = int.organisation[0]
    ini.main.gender = int.gender[0]
    inicfg.save(ini, directIni)
end
 

Dmitriy Makarov

25.05.2021
Проверенный
2,481
1,113
MIMGUI
Ошибок никаких нету, но после перезагрузки скрипт отказывается сохранять все то что было до перезагрузки в этих полях
code:
local inicfg = require 'inicfg'
local directIni = 'MedicalHelperLite.ini'
local ini = inicfg.load(inicfg.load({
    main = {
        nickname = '',
        rank = '',
        taginr = '',
        org = 0,
        gender = 0,
        usetag = false
    },
}, directIni))
inicfg.save(ini, directIni)
-- // local renderWindow = new.bool(false)
local bool = {
    usetag = new.bool(ini.main.usetag)
}

local strg = {
    NickName = new.char[256](u8:decode(ini.main.nickname)),
    rank = new.char[256](u8:decode(ini.main.rank)),
    taginr = new.char[256](u8:decode(ini.main.taginr))
}

local int = {
    organisation = new.int(ini.main.org),
    gender = new.int(ini.main.gender)
}

local newFrame = imgui.OnFrame(
    function() return renderWindow[0] end,
    function(self)
        local resX, resY = getScreenResolution()
        local sizeX, sizeY = 300, 300
        imgui.SetNextWindowPos(imgui.ImVec2(resX / 2, resY / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
        imgui.SetNextWindowSize(imgui.ImVec2(sizeX, sizeY), imgui.Cond.FirstUseEver)
        imgui.Begin('Medical Helper', renderWindow, imgui.WindowFlags.NoResize + imgui.WindowFlags.NoTitleBar)
            imgui.SetCursorPosX(500)
            imgui.CloseButton('CloseThisWindow', renderWindow, 25, 25)
            if imgui.CollapsingHeader(u8'Основная информация') then
                imgui.PushItemWidth(120)
                    if imgui.Combo(u8'Организация', int.organisation, ImOrg, #org) then save() end
                    imgui.SameLine()
                    imgui.SetCursorPosX(210)
                    if imgui.Checkbox(u8'Использовать тег в рацию', bool.usetag) then save() end
                    if imgui.InputText(u8'Имя и Фамилия', strg.NickName, 48) then save() end
                    if imgui.InputText(u8'Должность', strg.rank, 48) then save() end
                    if bool.usetag[0] then
                        imgui.InputText(u8'Тег в рацию', strg.taginr, 48)
                        save()
                    end
                    imgui.Combo(u8'Пол вашего персонажа', int.gender, ImGender, #gender)
                imgui.PopItemWidth()
        imgui.End()
    end
)

function save()
    ini.main.usetag = bool.usetag[0]
    ini.main.nickname = u8:decode(str(strg.NickName))
    ini.main.rank = u8:decode(str(strg.rank))
    ini.main.taginr = u8:decode(str(strg.taginr))
    ini.main.org = int.organisation[0]
    ini.main.gender = int.gender[0]
    inicfg.save(ini, directIni)
end
В функции save() убери все u8:decode.
Lua:
function save()
    ini.main.usetag = bool.usetag[0]
    ini.main.nickname = str(strg.NickName)
    ini.main.rank = str(strg.rank)
    ini.main.taginr = str(strg.taginr)
    ini.main.org = int.organisation[0]
    ini.main.gender = int.gender[0]
    inicfg.save(ini, directIni)
end
Screenshot_1.png
 
  • Нравится
Реакции: sat0ry

sep

Известный
673
76
как сделать так чтобы все видели что я стою на месте но я был на других координатах ? и мог взаимодействовать с чемто
1) тут видно что я тп
function sampev.onSendPlayerSync(data)
data.position =
2) тут невидно всем что я тп но немогу взаимодействовать

код:
    sampRegisterChatCommand('tp1', function()
        active = not active
        if active then
            savedPos = {getCharCoordinates(PLAYER_PED)}
            setCharCoordinates(PLAYER_PED, 505.4677, -2359.3694, 1503.4286)
        else
            setCharCoordinates(PLAYER_PED, savedPos[1], savedPos[2], savedPos[3])
        end
    end)
    wait(-1)
end


function sampev.onSendPlayerSync()
    return not active
end
 

sat0ry

Известный
1,087
290
как сделать так чтобы все видели что я стою на месте но я был на других координатах ? и мог взаимодействовать с чемто
1) тут видно что я тп
function sampev.onSendPlayerSync(data)
data.position =
2) тут невидно всем что я тп но немогу взаимодействовать

код:
    sampRegisterChatCommand('tp1', function()
        active = not active
        if active then
            savedPos = {getCharCoordinates(PLAYER_PED)}
            setCharCoordinates(PLAYER_PED, 505.4677, -2359.3694, 1503.4286)
        else
            setCharCoordinates(PLAYER_PED, savedPos[1], savedPos[2], savedPos[3])
        end
    end)
    wait(-1)
end


function sampev.onSendPlayerSync()
    return not active
end
Вроде как ты в любом случае не сможешь взаимодействовать, ибо твой персонаж находится на других координатах
 
  • Нравится
Реакции: moreveal

BANINI

Участник
63
3
Помогите!!! Как сделать чтобы данные с imgui.InputText сохранялись в ini cfg?

с 69 строки

Код:
require "moonloader"
require "sampfuncs"
require "lib.moonloader"
encoding = require "encoding"
inicfg = require "inicfg"
encoding.default = "CP1251"
u8 = encoding.UTF8

local imgui = require 'mimgui'
local vkeys = require 'vkeys'
local memory = require 'memory'
local sampev = require 'lib.samp.events'
local wm = require 'windows.message'
local ffi = require 'ffi'

local new, str, sizeof = imgui.new, ffi.string, ffi.sizeof
local renderWindow, hhelp = new.bool(), new.bool(), new.bool()
local inputField = new.char[256](--[[Здесь также следует кодировать информацию!]])
local sizeX, sizeY = getScreenResolution()
arrSelectable = {false,false,false}

local inicfg = require 'inicfg'

local Ini = inicfg.load(nil, "helper") -- загружаем конфиг
if Ini == nil then -- если нету конфига то
local settingst = {
info = {
    creator = "Banini",
    Nime_Script = "Helper"
}
}
inicfg.save(settingst, "helper") -- сохраняем
end
local helper = inicfg.load(nil,"helper") -- загружаем основной конфиг


function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
  
    addEventHandler('onWindowMessage', function(msg, wparam, lparam) -- Сама функция, в которой будем обрабатывать горячие клавиши. Обратите внимание, что данный способ является наиболее верным в плане оптимизации.
        if msg == wm.WM_KEYDOWN or msg == wm.WM_SYSKEYDOWN then -- Если клавиша нажата
            if wparam == vkeys.VK_X then -- И если это клавиша X
                renderWindow[0] = not renderWindow[0] -- Переключаем состояние рендера
            end
        end
    end)
  
    sampRegisterChatCommand("hhelp", function() hhelp[0] = not hhelp[0] end)
    sampRegisterChatCommand("create", createCallBack)
    sampRegisterChatCommand("infa", infaCallBack)

    wait(-1)
end

local menu = 0

local newFrame = imgui.OnFrame(function() return renderWindow[0] end, function(player)
        imgui.SetNextWindowPos(imgui.ImVec2(sizeX / 2, sizeY / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5)) -- Укажем положение окна по центру и выставим оффсет 0.5, чтобы рендер шёл от середины окна
        imgui.SetNextWindowSize(imgui.ImVec2(5000, 1000), imgui.Cond.FirstUseEver) -- Укажем размер
        imgui.Begin(u8"Основное меню Xelpera", renderWindow, imgui.WindowFlags.NoTitleBar)
      
        imgui.BeginChild("Menu", imgui.ImVec2(100, 300), true)

            if imgui.Button(u8"Настройки") then
                menu = 3
            end

        elseif menu == 3 then
            imgui.BeginChild("Menu3", imgui.ImVec2(500, 300), true)
                imgui.InputText(u8"Привет", inputField, sizeof(inputField))
                if imgui.Button(u8"Сохранить") then
                    helper.info.Nime_Script = "123"
                    inicfg.save(settingst, "helper") -- сохраняем
                end
            imgui.EndChild()

        imgui.End()
    end
  
end)

Ошибка:
helper.lua: D:\GTA 140K BY DAPO SHOW\moonloader\helper.lua:134: attempt to call field 'save' (a nil value)
stack traceback:
D:\GTA 140K BY DAPO SHOW\moonloader\helper.lua:134: in function '_draw'
D:\GTA 140K BY DAPO SHOW\moonloader\lib\mimgui\init.lua:107: in function <D:\GTA 140K BY DAPO SHOW\moonloader\lib\mimgui\init.lua:91>
[03:38:27.733946] (error) helper.lua: Script died due to an error. (1A14566C)
 
Последнее редактирование:

Tensay

Активный
169
51
Почему при выгрузке скрипта, крашит самп?
GovnoCode:
script_name('Script')
script_author('Yokoyama')


local encoding = require 'encoding'
local imgui = require 'imgui'
local sampev = require 'samp.events'
local ffi = require 'ffi'
local vkeys = require 'vkeys'
local memory = require 'memory'
local wm = require 'lib.windows.message'
local requests = require('requests')


local notf_ok, notf = pcall(import, 'lib\\lib_imgui_notf.lua')
if not notf_ok then
    local dlstatus = require('moonloader').download_status
    downloadUrlToFile('https://raw.githubusercontent.com/akaYokoyama/GovnoCode/main/lib_imgui_notf.lua', getWorkingDirectory()..'\\lib\\lib_imgui_notf.lua', function (id, status, p1, p2)
        if status == dlstatus.STATUSEX_ENDDOWNLOAD then
            thisScript():reload()
        end
    end)
end


function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(200) end
    sampRegisterChatCommand('nr',repair)
    local request = requests.get('https://raw.githubusercontent.com/akaYokoyama/GovnoCode/main/repairpodpiska')
    local nick = sampGetPlayerNickname(select(2, sampGetPlayerIdByCharHandle(PLAYER_PED)))
    local function res()
        for n in request.text:gmatch('[^\r\n]+') do
            if nick:find(n) then return true end
        end
        return false
    end
    if not res() then
        lua_thread.create(function()
                notf.addNotify('{ffffff}<> {4096ff}Script{ffffff} <>','Ваш ник не найден в базе данных,\nвозможно, вы не купили привязку.\nСкрипт отключается.', 2, 2, 3)
                 wait(4000)
                thisScript():unload() -- проблемы c этой строкой
            end)  
    else
        notf.addNotify('{ffffff}<> {4096ff}Script{ffffff} <>','Скрипт успешно загружен.\n Ваш ник найден в базе данных.', 2, 2, 3)
    end  
    while true do wait(0)
    end
end
 

abbv

Потрачен
121
41
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
как сделать так чтобы все видели что я стою на месте но я был на других координатах ? и мог взаимодействовать с чемто
1) тут видно что я тп
function sampev.onSendPlayerSync(data)
data.position =
2) тут невидно всем что я тп но немогу взаимодействовать

код:
    sampRegisterChatCommand('tp1', function()
        active = not active
        if active then
            savedPos = {getCharCoordinates(PLAYER_PED)}
            setCharCoordinates(PLAYER_PED, 505.4677, -2359.3694, 1503.4286)
        else
            setCharCoordinates(PLAYER_PED, savedPos[1], savedPos[2], savedPos[3])
        end
    end)
    wait(-1)
end


function sampev.onSendPlayerSync()
    return not active
end

никак, сервер примет те координаты, которые ты отправил, а тут ты их не отправляешь, а просто ставишь в игре эту позицию

Почему при выгрузке скрипта, крашит самп?
GovnoCode:
script_name('Script')
script_author('Yokoyama')


local encoding = require 'encoding'
local imgui = require 'imgui'
local sampev = require 'samp.events'
local ffi = require 'ffi'
local vkeys = require 'vkeys'
local memory = require 'memory'
local wm = require 'lib.windows.message'
local requests = require('requests')


local notf_ok, notf = pcall(import, 'lib\\lib_imgui_notf.lua')
if not notf_ok then
    local dlstatus = require('moonloader').download_status
    downloadUrlToFile('https://raw.githubusercontent.com/akaYokoyama/GovnoCode/main/lib_imgui_notf.lua', getWorkingDirectory()..'\\lib\\lib_imgui_notf.lua', function (id, status, p1, p2)
        if status == dlstatus.STATUSEX_ENDDOWNLOAD then
            thisScript():reload()
        end
    end)
end


function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(200) end
    sampRegisterChatCommand('nr',repair)
    local request = requests.get('https://raw.githubusercontent.com/akaYokoyama/GovnoCode/main/repairpodpiska')
    local nick = sampGetPlayerNickname(select(2, sampGetPlayerIdByCharHandle(PLAYER_PED)))
    local function res()
        for n in request.text:gmatch('[^\r\n]+') do
            if nick:find(n) then return true end
        end
        return false
    end
    if not res() then
        lua_thread.create(function()
                notf.addNotify('{ffffff}<> {4096ff}Script{ffffff} <>','Ваш ник не найден в базе данных,\nвозможно, вы не купили привязку.\nСкрипт отключается.', 2, 2, 3)
                 wait(4000)
                thisScript():unload() -- проблемы c этой строкой
            end)
    else
        notf.addNotify('{ffffff}<> {4096ff}Script{ffffff} <>','Скрипт успешно загружен.\n Ваш ник найден в базе данных.', 2, 2, 3)
    end
    while true do wait(0)
    end
end
вариант с выгрузкой скрипта - самый ужасный, человек добавит в конец скрипта
Lua:
thisScript():unload() = function()
и твой скрипт пососёт
лучше функции переводи в false, это намного лучше

Помогите!!! Как сделать чтобы данные с imgui.InputText сохранялись в ini cfg?

с 69 строки

Код:
require "moonloader"
require "sampfuncs"
require "lib.moonloader"
encoding = require "encoding"
inicfg = require "inicfg"
encoding.default = "CP1251"
u8 = encoding.UTF8

local imgui = require 'mimgui'
local vkeys = require 'vkeys'
local memory = require 'memory'
local sampev = require 'lib.samp.events'
local wm = require 'windows.message'
local ffi = require 'ffi'

local new, str, sizeof = imgui.new, ffi.string, ffi.sizeof
local renderWindow, hhelp = new.bool(), new.bool(), new.bool()
local inputField = new.char[256](--[[Здесь также следует кодировать информацию!]])
local sizeX, sizeY = getScreenResolution()
arrSelectable = {false,false,false}

local inicfg = require 'inicfg'

local Ini = inicfg.load(nil, "helper") -- загружаем конфиг
if Ini == nil then -- если нету конфига то
local settingst = {
info = {
    creator = "Banini",
    Nime_Script = "Helper"
}
}
inicfg.save(settingst, "helper") -- сохраняем
end
local helper = inicfg.load(nil,"helper") -- загружаем основной конфиг


function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
 
    addEventHandler('onWindowMessage', function(msg, wparam, lparam) -- Сама функция, в которой будем обрабатывать горячие клавиши. Обратите внимание, что данный способ является наиболее верным в плане оптимизации.
        if msg == wm.WM_KEYDOWN or msg == wm.WM_SYSKEYDOWN then -- Если клавиша нажата
            if wparam == vkeys.VK_X then -- И если это клавиша X
                renderWindow[0] = not renderWindow[0] -- Переключаем состояние рендера
            end
        end
    end)
 
    sampRegisterChatCommand("hhelp", function() hhelp[0] = not hhelp[0] end)
    sampRegisterChatCommand("create", createCallBack)
    sampRegisterChatCommand("infa", infaCallBack)

    wait(-1)
end

local menu = 0

local newFrame = imgui.OnFrame(function() return renderWindow[0] end, function(player)
        imgui.SetNextWindowPos(imgui.ImVec2(sizeX / 2, sizeY / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5)) -- Укажем положение окна по центру и выставим оффсет 0.5, чтобы рендер шёл от середины окна
        imgui.SetNextWindowSize(imgui.ImVec2(5000, 1000), imgui.Cond.FirstUseEver) -- Укажем размер
        imgui.Begin(u8"Основное меню Xelpera", renderWindow, imgui.WindowFlags.NoTitleBar)
     
        imgui.BeginChild("Menu", imgui.ImVec2(100, 300), true)

            if imgui.Button(u8"Настройки") then
                menu = 3
            end

        elseif menu == 3 then
            imgui.BeginChild("Menu3", imgui.ImVec2(500, 300), true)
                imgui.InputText(u8"Привет", inputField, sizeof(inputField))
                if imgui.Button(u8"Сохранить") then
                    helper.info.Nime_Script = "123"
                    inicfg.save(settingst, "helper") -- сохраняем
                end
            imgui.EndChild()

        imgui.End()
    end
 
end)

Ошибка:
helper.lua: D:\GTA 140K BY DAPO SHOW\moonloader\helper.lua:134: attempt to call field 'save' (a nil value)
stack traceback:
D:\GTA 140K BY DAPO SHOW\moonloader\helper.lua:134: in function '_draw'
D:\GTA 140K BY DAPO SHOW\moonloader\lib\mimgui\init.lua:107: in function <D:\GTA 140K BY DAPO SHOW\moonloader\lib\mimgui\init.lua:91>
[03:38:27.733946] (error) helper.lua: Script died due to an error. (1A14566C)
фулл код вставь, ошибка на 134 строке, а у тебя всего 81

Помогите пазязя

Пытался сделать чтобы в окне imgui данные обновлялись, но чего-то не выходит. Выдает такую ошибку:
[14:31:30.386274] (error) ChatLua.lua: D:\GTA 140K BY DAPO SHOW\moonloader\ChatLua.lua:42: attempt to concatenate global 'money' (a nil value)
stack traceback:
D:\GTA 140K BY DAPO SHOW\moonloader\ChatLua.lua:42: in function '_draw'
D:\GTA 140K BY DAPO SHOW\moonloader\lib\mimgui\init.lua:107: in function <D:\GTA 140K BY DAPO SHOW\moonloader\lib\mimgui\init.lua:91>
[14:31:30.386274] (error) ChatLua.lua: Script died due to an error. (1C89634C)
И так на каждую переменную :_(

Вот сам кривой код:

Кодик:
require "moonloader"
require "sampfuncs"
require "lib.moonloader"
encoding = require "encoding"
inicfg = require "inicfg"
encoding.default = "CP1251"
u8 = encoding.UTF8

local imgui = require 'mimgui'
local vkeys = require 'vkeys'
local memory = require 'memory'

local wm = require 'windows.message'

local new = imgui.new
local renderWindow = new.bool()
local sizeX, sizeY = getScreenResolution()

function update()
    lua_thread.create(function()
        while true do
            wait(100)
           
            _, myid = sampGetPlayerIdByCharHandle(PLAYER_PED) -- получение своего id (нужно, чтобы получить свой пинг)
            money = getPlayerMoney(myid) -- получаем кол-во денег
            ping = sampGetPlayerPing(myid) -- получаем пинг
            fps = memory.getfloat(0xB7CB50, true) -- получение фпс
            health,_draw = sampGetPlayerHealth(myid)
            nick = sampGetPlayerNickname(PLAYER_PED)
           
        end
    end)
end

local newFrame = imgui.OnFrame(
    function() return renderWindow[0] end,
    function(player)
        imgui.SetNextWindowPos(imgui.ImVec2(sizeX / 2, sizeY / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5)) -- Укажем положение окна по центру и выставим оффсет 0.5, чтобы рендер шёл от середины окна
        imgui.SetNextWindowSize(imgui.ImVec2(200, 150), imgui.Cond.FirstUseEver) -- Укажем размер
        imgui.Begin(u8"Оконо САМП", renderWindow)
        imgui.Text(u8"Хай! Ку-ку")
        imgui.Text(string.format(u8"хуй знает что это: %s", renderWindow[0]))
        imgui.Text(u8"Ваш ник: " ..nick)
        imgui.Text(u8"Денег: " ..money)
        imgui.Text(u8"Пинг: " ..ping)
        imgui.Text(u8"FPS: " ..fps)
        imgui.Text(u8"health: " ..health)
        imgui.End()
    end
)

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
   
    addEventHandler('onWindowMessage', function(msg, wparam, lparam) -- Сама функция, в которой будем обрабатывать горячие клавиши. Обратите внимание, что данный способ является наиболее верным в плане оптимизации.
        if msg == wm.WM_KEYDOWN or msg == wm.WM_SYSKEYDOWN then -- Если клавиша нажата
            if wparam == vkeys.VK_X then -- И если это клавиша X
                renderWindow[0] = not renderWindow[0] -- Переключаем состояние рендера
            end
            update()
        end
    end)
    wait(-1)
end
используй string.format на каждую строку, у тебя по какой то причине money == nil, вот и не выводит

Lua:
        asyncHttpRequest('GET', 'https://sampwiki.blast.hk/wiki/Dialog_Styles', nil,
        --взял как пример
          function(response)

          end,
          function(err)
          --
        end)
как парсить хайдер <h2>.+</h2>
а то не идёт
Код:
[22:44:41.102644] (error)    test.lua: D:\GTA\GTASHKA\moonloader\test.lua:82: attempt to call a number value
stack traceback:
    D:\GTA\GTASHKA\moonloader\test.lua: in function 'resolve'
    D:\GTA\GTASHKA\moonloader\test.lua:153: in function <D:\GTA\GTASHKA\moonloader\test.lua:145>
[22:44:41.102644] (error)    test.lua: Script died due to an error. (146C6D64)
ты кидаешь 8 строк, когда у тебя ошибка на 153, ну ты гений или что
 
Последнее редактирование: