Вопросы по 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
 
Последнее редактирование:

sᴀxᴏɴ

саксофон
Всефорумный модератор
791
853
Как вставить опреdелённое фото в коd?Т.е открывается окошко,а там фотолупа
Первой функцией загружаешь текстуру, второй рендеришь. Вроде бы так, давно делал это, точно уже не помню
Lua:
DxTexture texture = renderLoadTextureFromFile(zstring file)
--
renderDrawTexture(DxTexture texture, float posX, float posY, float sizeX, float sizeY, float rotation, uint color)
 
  • Нравится
Реакции: damag и Dragynovv

Dragynovv

Известный
257
209
Первой функцией загружаешь текстуру, второй рендеришь. Вроде бы так, давно делал это, точно уже не помню
Lua:
DxTexture texture = renderLoadTextureFromFile(zstring file)
--
renderDrawTexture(DxTexture texture, float posX, float posY, float sizeX, float sizeY, float rotation, uint color)
а как указать путь к фотолупе?и куdа его поместить
 

sᴀxᴏɴ

саксофон
Всефорумный модератор
791
853
а как указать путь к фотолупе?и куdа его поместить
Lua:
function main()
    while not isSampAvailable() do wait(100) end
    texture = renderLoadTextureFromFile('moonloader\\penis_detrov.jpg')
    while true do wait(0)
        renderDrawTexture(texture, 900, 500, 800, 500, 0, -1)
    end
    wait(-1)
end
Вместо 900, 500 ставишь координаты, вместо 800, 500 размер. На выходе получаем фотолуп масконосца

43583
 
  • Нравится
Реакции: damag и Dragynovv

Dragynovv

Известный
257
209
Lua:
function main()
    while not isSampAvailable() do wait(100) end
    texture = renderLoadTextureFromFile('moonloader\\penis_detrov.jpg')
    while true do wait(0)
        renderDrawTexture(texture, 900, 500, 800, 500, 0, -1)
    end
    wait(-1)
end
Вместо 900, 500 ставишь координаты, вместо 800, 500 размер. На выходе получаем фотолуп масконосца

Посмотреть вложение 43583
ебатб,пасиба большое.Ещё оdин вопрос,а можно фотолупу,dопустим dеdа,прикрепить к Imgui менюшке?
 

neverlane

t.me/neverlane00
Друг
1,010
1,163
хелп, вот есть код
Код:
script_name('Auto-Eat For Arizona RP')
script_author('Ronny Evans')
script_version('1.2')

local imgui = require 'imgui'
local encoding = require 'encoding'
local inicfg = require 'inicfg'
local sampev = require 'lib.samp.events'
encoding.default = 'CP1251'
u8 = encoding.UTF8

local mainIni = inicfg.load({
    config = {
        setmetod = 0,
        eathome = false,
        eatnohome = false,
        arztextdrawid = '659',
        healstate = false,
        hplvl = 30,
        hpmetod = 0,
        arztextdrawidheal = ' '
    }
}, 'auto-eat.ini')

local eathome = imgui.ImBool(mainIni.config.eathome)
local eatnohome = imgui.ImBool(mainIni.config.eatnohome)
local arztextdrawid = imgui.ImBuffer(''..mainIni.config.arztextdrawid, 10)
local arztextdrawidheal = imgui.ImBuffer(''..mainIni.config.arztextdrawidheal, 10)
local setmetod = imgui.ImInt(mainIni.config.setmetod)
local hpmetod = imgui.ImInt(mainIni.config.hpmetod)
local healstate = imgui.ImBool(mainIni.config.healstate)
local hplvl = imgui.ImBuffer(''..mainIni.config.hplvl, 3)

local status = inicfg.load(mainIni, 'auto-eat.ini')
if not doesFileExist('moonloader/config/auto-eat.ini') then inicfg.save(mainIni, 'auto-eat.ini') end

local metod = {
    u8'Чипсы',
    u8'Рыба',
    u8'Оленина',
    u8'TextDraw'
}
local healmetod = {
    u8'Аптечка',
    u8'Наркотики',
    u8'Андреналин',
    u8'Пиво',
    u8'TextDraw'
}

local main_window_state = imgui.ImBool(false)

function imgui.OnDrawFrame()
imgui.ShowCursor = main_window_state.v
if main_window_state.v then
    local sw, sh = getScreenResolution()
    imgui.SetNextWindowPos(imgui.ImVec2(sw / 2, sh / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
    imgui.SetNextWindowSize(imgui.ImVec2(220, 320), imgui.Cond.FirstUseEver)
    imgui.Begin('Auto-Eat | Ronny Evans', main_window_state, imgui.WindowFlags.NoResize + imgui.WindowFlags.NoCollapse + imgui.WindowFlags.NoScrollbar)
    imgui.BeginChild("#main", imgui.ImVec2(200, 260), true, imgui.WindowFlags.NoScrollbar)
        imgui.Checkbox(u8"Кушать в доме", eathome)
        imgui.SameLine()
        imgui.TextQuestion(u8'Ваш персонаж будет кушать дома из холодильника')
        imgui.Checkbox(u8'Хил если уровень хп', healstate)
        imgui.Text(u8'вашего персонажа >')
        imgui.SameLine()
        imgui.PushItemWidth(40)
        imgui.InputText(u8'##ggr', hplvl)
        imgui.PopItemWidth()
        if healstate.v then
            imgui.Text(u8 'Выбор метода хила:')
            imgui.PushItemWidth(100)
            if imgui.Combo('##ban',hpmetod,healmetod,-1) then
                mainIni.config.hpmetod = hpmetod.v
                inicfg.save(mainIni, 'auto-eat.ini')
            end
            if mainIni.config.hpmetod == 4 then
                imgui.InputText(u8"ID TextDraw'a##4245",arztextdrawidheal)
            end
            imgui.PopItemWidth()
        end
        imgui.Checkbox(u8"Кушать вне дома", eatnohome)
        imgui.SameLine()
        imgui.TextQuestion(u8'Ваш персонаж будет кушать вне дома способом из списка')
        if eatnohome.v then
            imgui.Text(u8'Выбор метода еды:')
            imgui.PushItemWidth(100)
            if imgui.Combo(' ', setmetod, metod, -1) then
                mainIni.config.setmetod = setmetod.v
                inicfg.save(mainIni, 'auto-eat.ini')
            end     
            imgui.PopItemWidth()
            if mainIni.config.setmetod == 3 then
                imgui.PushItemWidth(100)
                imgui.InputText(u8"ID TextDraw'a", arztextdrawid)
                imgui.PopItemWidth()
                imgui.SameLine()
                imgui.TextQuestion(u8"ID TextDraw'a по которому будет кликать скрипт чтобы покушать")
            end   
        end
    imgui.EndChild()
        imgui.SetCursorPos(imgui.ImVec2(35,293))
        if imgui.Button(u8'Сохранить настройки',imgui.ImVec2(150,20)) then
            mainIni.config.eathome = eathome.v
            mainIni.config.eatnohome = eatnohome.v
            mainIni.config.arztextdrawid = arztextdrawid.v
            mainIni.config.setmetod = setmetod.v
            mainIni.config.hpmetod = hpmetod.v
            mainIni.config.hplvl = hplvl.v
            mainIni.config.healstate = healstate.v
            inicfg.save(mainIni, 'auto-eat.ini')
            sampAddChatMessage("{00ffa8}[Auto-Eat]{ffffff}: Настройки обновлены!",-1)
      end
  imgui.End()
end
end

function imgui.TextQuestion(text)
    imgui.TextDisabled('(?)')
    if imgui.IsItemHovered() then
        imgui.BeginTooltip()
        imgui.PushTextWrapPos(450)
        imgui.TextUnformatted(text)
        imgui.PopTextWrapPos()
        imgui.EndTooltip()
    end
end

function main()
    while not isSampAvailable() do wait(0) end
    sampAddChatMessage('{00FFA8}[Auto-Eat]{ffffff}: Скрипт был успешно загружен! Версия: 1.2 Автор: Ronny Evans',-1)
    sampAddChatMessage('{00FFA8}[Auto-Eat]{ffffff}: /aset - открыть меню. /aeat - покушать кликнув по текстдраву',-1)
    sampRegisterChatCommand('aset', function(arg)
        main_window_state.v = not main_window_state.v
        imgui.Process = main_window_state
    end)
    sampRegisterChatCommand('aeat', function()
        sampSendClickTextdraw(arztextdrawid.v)
    end)
    while true do
        wait(0)
        local hp = getCharHealth(PLAYER_PED)
        if healstate.v then
            if hp < hplvl.v then
                if mainIni.config.hpmetod == 0 then
                    sampSendChat('/usemed')
                end   
                if mainIni.config.hpmetod == 1 then
                    sampSendChat('/usedrugs 1')
                    wait(5000)
                    sampSendChat('/usedrugs 1')
                    wait(5000)
                    sampSendChat('/usedrugs 1')
                end
                if mainIni.config.hpmetod == 2 then
                    sampSendChat('/adrenaline')
                end   
                if mainIni.config.hpmetod == 3 then
                    sampSendChat('/beer')
                end
            end   
        end
    end
end   

function sampev.onDisplayGameText(style, time, text)
lua_thread.create(function()
    if eathome.v then
        if text == ('You are hungry!') then
            sampAddChatMessage('{00FFA8}[Auto-Eat]{ffffff}: Реагирую, кушаю',-1)
            sampSendChat('/home')
            sampSendDialogResponse(174, 1, 1, false)
            sampSendDialogResponse(2431, 1, 0, false)
            sampSendDialogResponse(185, 1, 6, false)
            wait(500)
            sampCloseCurrentDialogWithButton(0)
        end
    end
    if eatnohome.v then
        if text == ('You are hungry!') then
            sampAddChatMessage('{00FFA8}[Auto-Eat]{ffffff}: Реагирую, кушаю',-1)
            if mainIni.config.setmetod == 0 then
                sampSendChat('/eat')
                for i = 1,30 do
                    sampSendDialogResponse(9965, 1, 0, false)
                    wait(4000)
                end   
                sampCloseCurrentDialogWithButton(1) 
            end   
            if mainIni.config.setmetod == 1 then
                sampSendChat('/eat')
                for k = 1,10 do
                    sampSendDialogResponse(9965, 1, 1, false)
                    wait(4000)
                end   
                sampCloseCurrentDialogWithButton(1) 
            end   
            if mainIni.config.setmetod == 2 then
                sampSendChat('/eat')
                sampSendDialogResponse(9965, 1, 2, false)
                wait(4000) 
                sampCloseCurrentDialogWithButton(1) 
            end   
            if mainIni.config.setmetod == 3 then
                sampSendClickTextdraw(arztextdrawid.v)
                sampSendClickTextdraw(arztextdrawid.v)
            end
        end
    end
end)
end
и почему-то жалуется на 144 строку
Ошибка:
[ML] (error) Auto-Eat For Arizona RP: D:\GTA DNO PC DAPO SHOW\moonloader\auto-eat.lua:144: attempt to compare number with string
 

sᴀxᴏɴ

саксофон
Всефорумный модератор
791
853
ебатб,пасиба большое.Ещё оdин вопрос,а можно фотолупу,dопустим dеdа,прикрепить к Imgui менюшке?

Lua:
local imgui = require 'imgui'
local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8

function main()
  while not isSampAvailable() do wait(100) end
  zhma = imgui.CreateTextureFromFile('moonloader\\fikalis.jpg')
  imgui.Process = true
end

function imgui.OnDrawFrame()
  imgui.SetNextWindowSize(imgui.ImVec2(1000, 800), imgui.Cond.FirstUseEver)
  imgui.Begin(u8'жма', main_window_state, imgui.WindowFlags.NoCollapse)
  imgui.SetWindowPos(u8'жма', imgui.ImVec2(500, 200), imgui.Cond.FirstUseEver)
  imgui.Text(u8'ТА ЗА ШО ДЕДА????????')
  imgui.Image(zhma, imgui.ImVec2(500, 400))
  imgui.End()
end
43585

и почему-то жалуется на 144 строку
Ошибка:
[ML] (error) Auto-Eat For Arizona RP: D:\GTA DNO PC DAPO SHOW\moonloader\auto-eat.lua:144: attempt to compare number with string
if hp < tonumber(hplvl.v) then
 

sᴀxᴏɴ

саксофон
Всефорумный модератор
791
853
Как узнать ли машина окрыта
Lua:
function main()
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand('getdoor', function(id)
        local res, carHandle = sampGetCarHandleBySampVehicleId(id)
        if res then
            local doorStatus = getCarDoorLockStatus(carHandle)
            sampAddChatMessage(doorStatus > 0 and 'Машина закрыта' or 'Машина открыта', -1)
        end
    end)
    wait(-1)
end
 

Seetvek

Известный
22
1
видел какой то скрипт, который показывал id текстдрава прямо на самом текстдраве, не подскажете название?)
 

_razor

t.me/sssecretway | ТГК: t.me/razor_code
Всефорумный модератор
1,948
3,211
видел какой то скрипт, который показывал id текстдрава прямо на самом текстдраве, не подскажете название?)
 
  • Нравится
Реакции: Seetvek и AnWu

sᴀxᴏɴ

саксофон
Всефорумный модератор
791
853
видел какой то скрипт, который показывал id текстдрава прямо на самом текстдраве, не подскажете название?)
TextdrawEditor By Sargon.luac позволяет редактировать текстравы и показать их ID
Textdraw.lua позволяет удалять, показывать id
 

Вложения

  • TextdrawEditor By Sargon.luac
    14.6 KB · Просмотры: 21
  • TextDraw.lua
    1.6 KB · Просмотры: 17

Dragynovv

Известный
257
209
Lua:
local imgui = require 'imgui'
local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8

function main()
  while not isSampAvailable() do wait(100) end
  zhma = imgui.CreateTextureFromFile('moonloader\\fikalis.jpg')
  imgui.Process = true
end

function imgui.OnDrawFrame()
  imgui.SetNextWindowSize(imgui.ImVec2(1000, 800), imgui.Cond.FirstUseEver)
  imgui.Begin(u8'жма', main_window_state, imgui.WindowFlags.NoCollapse)
  imgui.SetWindowPos(u8'жма', imgui.ImVec2(500, 200), imgui.Cond.FirstUseEver)
  imgui.Text(u8'ТА ЗА ШО ДЕДА????????')
  imgui.Image(zhma, imgui.ImVec2(500, 400))
  imgui.End()
end
Посмотреть вложение 43585

if hp < tonumber(hplvl.v) then
чуваааааак,пасибо большое,я с этим dо 3 ночи сиdел,ебался с CreateTextureFromFile и пытался запихать его в отdельную функу,пасиба большое брат
 

Vespan

Чешский луашер
Проверенный
2,120
1,722
Как узнать ид транспорта(/dl) через другую команду,допустим /getid