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

Itachi Uchiha

Участник
124
21
Да, не так вставил...

Мы че ванги? где код?
Lua:
--Имгуи Драв Фрейм
if okno == 8 then
        openStats = true
        sampSendChat('/stats')
        imgui.Text(u8'Ваш игровой уровень:')
        imgui.SameLine()
        imgui.Text(lvl)
        imgui.Text(u8'Ваши деньги: $')
        imgui.SameLine()
        imgui.Text(mani)
end
-------------------------------------------
function sampev.onShowDialog(id, style, title, button1, button2, text)
    if openStats then
        openStats = false
        return false -- отмена открытия диалога
    end
end
Не робит, как диалог статистики все равно показывается ниже имгуи окна
 

kizn

q(≧▽≦q)
Всефорумный модератор
2,409
2,101
Lua:
--Имгуи Драв Фрейм
if okno == 8 then
        openStats = true
        sampSendChat('/stats')
        imgui.Text(u8'Ваш игровой уровень:')
        imgui.SameLine()
        imgui.Text(lvl)
        imgui.Text(u8'Ваши деньги: $')
        imgui.SameLine()
        imgui.Text(mani)
end
-------------------------------------------
function sampev.onShowDialog(id, style, title, button1, button2, text)
    if openStats then
        openStats = false
        return false -- отмена открытия диалога
    end
end
такое себе решение, в ondrawframe каждый кадр выполняется действие, так что sampsendchat нужно точно не здесь
 

Itachi Uchiha

Участник
124
21
в бесконечном цикле например с проверкой
Ничего не работает.

Lua:
function sampev.onShowDialog(id, style, title, button1, button2, text)
    if openStats then
        openStats = false
        return false -- отмена открытия диалога
    end
end
--Он драв фрейм
if okno == 8 then
        imgui.Checkbox(u8'Статистика', stata)
        if stata.v == true then
        imgui.Text(u8'Ваш игровой уровень:')
        imgui.SameLine()
        imgui.Text(lvl)
        imgui.Text(u8'Ваши деньги: $')
        imgui.SameLine()
        imgui.Text(mani)
        end
    end

--беск.цикл
while true do
        if stata.v == true then
            openStats = true
            sampSendChat('/stats')
        end
    wait(0)
end
 

wulfandr

Известный
636
260
зачем бесконечный цикл? создай поток функции после onshowdialog, откуда хукаешь лвл и так далее. при вызове функции, включить параметр imgui окна
 

LelHack

Известный
452
125
Как достать цвет текста из диалога? Можеть есть какой то скрипт?
 

Fott

Простреленный
3,461
2,378
Тоесть как узнать Hex код цвета текста в диалоге? Что бы был прям точный
Вопрос: Зачем? Если тебе просто цвет вытянуть надо, не понимаю конечно зачем, юзани диалог едитор от бабули, там цвет посмотреть можно. А скриптом скорее всего никак, да это и не нужно ведь поиск по тексту есть.
 
  • Нравится
Реакции: LelHack

Itachi Uchiha

Участник
124
21
Как сделать примерно такое окно? Только с другим текстом
1603194398891.png
 

Viem

Известный
49
5
Делаю обращение с луа на хостинг, хостинг возвращает <? echo time(); ?>

Почему в time() возвращается локальное время пк, хотя на хостинге стоит МСК время.

При этом date('H:I:s') - выводит тоже мск время, как это работает?)😀