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

chapo

чопа сребдс
Модератор
8,840
11,505
Response(ID, 1, 0,
sampSendDialogResponse(id, button, listitem, input)
Как присвоить аргументу id любое значение? Проще говоря как сделать, чтобы функция срабатывала на любой ид диалога?
Lua:
local sampev = require 'lib.samp.events'

function sampev.onShowDialog(id, style, title, button1, button2, text)
    sampSendDialogResponse(id, ид кнопки (0 / 1) , номер элемента списка (от 0), текст введенный в поле)
end
 

Curtis

Участник
282
10
Lua:
function sampev.onDisplayGameText(style, displayTime, text)
    if text:find("~w~Press ~r~~k~~PED_FIREWEAPON~") then
        lua_thread.create(function()
            wait(0)
            setVirtualKeyDown(0x01, true)
            wait(50)
            setVirtualKeyDown(0x01, false)
        end)
    end
    if text:find("~w~Press ~g~~k~~PED_LOCK_TARGET~") then
        lua_thread.create(function()
            wait(0)
            setVirtualKeyDown(0x02, true)
            wait(50)
            setVirtualKeyDown(0x02, false)
        end)
    end
end

почему не работает? Не нажимает на клавиши когда изменяется текст ?
актуально
 

Сheesecake

Участник
60
2
Как сделать нажатие на данную кнопку? Нажимается в целом она только пробелом в игре, хочу сделать чтобы скриптом нажимало
Но это вроде даже не текстдрав, поэтому не знаю как сделать, хелп)
Screenshot_15.png
 

paulohardy

вы еще постите говно? тогда я иду к вам
Всефорумный модератор
1,907
1,281
  • Нравится
Реакции: Сheesecake

paulohardy

вы еще постите говно? тогда я иду к вам
Всефорумный модератор
1,907
1,281
А не подскажешь, как правильно сделать проверку:
Если этого окна нету, то закрывало окно имгуи

Чет пробовал, но не так делаю все
Lua:
if sampSendMenuSelectRow(0) = false then
    test_okno.v = false
end
это функция отправки нажатия, чтобы делать проверки нужно хукать события, которые отвечают за создание этого меню
 
  • Нравится
Реакции: Сheesecake

Adrian G.

Известный
Проверенный
520
457
Почему эта функция(sampSendDialogResponse) написанная так, срабатывает один раз при вводе команды до перезапуска сампа? Либо вообще не срабатывает.
Lua:
function cmd_test(arg)
    if #arg == 0 then
        sampAddChatMessage('test', 0xa11d1d)
    else
        sampSendChat('/test')
        ID = sampGetCurrentDialogId()
        sampSendDialogResponse(ID, 1, 0, arg)
        
    end
end

А если в её аргумент вписать конкретный ид диалога, то она работает как часы, хотя по идее выполнятся должно точно также.

Lua:
function cmd_test(arg)
    if #arg == 0 then
        sampAddChatMessage(test', 0xa11d1d)
    else
        sampSendChat('/test')
        sampSendDialogResponse(32, 1, 0, arg)
    end
end
 

Сheesecake

Участник
60
2
Выручайте, как убрать крестик закрытия меню имжуи? "(Х)"

Lua:
      imgui.Begin(u8'Нудая', show_three_menu, imgui.WindowFlags.NoResize + imgui.WindowFlags.NoCollapse)
 

paulohardy

вы еще постите говно? тогда я иду к вам
Всефорумный модератор
1,907
1,281
  • Влюблен
Реакции: Сheesecake

Kirill Dumchik

Участник
61
3
Привет. У меня есть небольшая проблема с showcursor. У меня есть несколько окон имгуи и процесс зависит от их 3-х, поэтому если я например закрою первое окно в тот момент, как открыто другое, то открытые менюшки из первого окна не закрываются, и я решил сделать так:

Lua:
    if main_window_state.v == false then
        show_two_menu.v = false
        show_three_menu.v = false
        show_for_menu.v = false
        show_five_menu.v = false
        show_six_menu.v = false
        show_seven_menu.v = false
        show_eight_menu.v = false
        show_nine_menu.v = false
    imgui.Process = false
    end

Но теперь во время закрытия этих менюшек курсор остается (не закрывается), вписывал showcursor = false, но тогда не работает мое сочитание клавиш, которое включает и выключает его. Как сделать правильней?

В самой команде открывающий окно вписано, чтобы курсор активировался при активации команды
 
Последнее редактирование:
  • Нравится
Реакции: frit

paulohardy

вы еще постите говно? тогда я иду к вам
Всефорумный модератор
1,907
1,281
Привет. У меня есть небольшая проблема с showcursor. У меня есть несколько окон имгуи и процесс зависит от их 3-х, поэтому если я например закрою первое окно в тот момент, как открыто другое, то открытые менюшки из первого окна не закрываются, и я решил сделать так:

Lua:
    if main_window_state.v == false then
        show_two_menu.v = false
        show_three_menu.v = false
        show_for_menu.v = false
        show_five_menu.v = false
        show_six_menu.v = false
        show_seven_menu.v = false
        show_eight_menu.v = false
        show_nine_menu.v = false
    imgui.Process = false
    end

Но теперь во время закрытия этих менюшек курсор остается (не закрывается), вписывал showcursor = false, но тогда не работает мое сочитание клавиш, которое включает и выключает его. Как сделать правильней?

В самой команде открывающий окно вписано, чтобы курсор активировался при активации команды
Lua:
bool = first_window.v or second_window.v or third_window.v
imgui.Process, imgui.ShowCursor = bool, bool
либо если хочешь изменять состояние курсора другой переменной: imgui.ShowCursor = bool or peremennaya
 
  • Нравится
Реакции: Kirill Dumchik

Kirill Dumchik

Участник
61
3
Lua:
bool = first_window.v or second_window.v or third_window.v
imgui.Process, imgui.ShowCursor = bool, bool
либо если хочешь изменять состояние курсора другой переменной: imgui.ShowCursor = bool or peremennaya
Не совсем понял, как это формить. Вроде сделал правильно, но теперь комбинация на включение и выключение курсора не работает на других окнах, только на 1 работает