Вопросы по 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

чопа сребдс // TG/IG: @moujeek
Модератор
9,020
11,852
Как считывать информацию c диалога / Как считывать информацию c диалога но что бы не открывать его визуально что ли?
Lua:
local dialogInfo;

function sampev.onShowDialog(id, title, b1, b2, text)
    dialogInfo = {
        id = id,
        title = title,
        b1 = b1,
        b2 = b2,
        text = text
    };
    sampCloseCurrentDialogWithButton(0);
    return false;
end

-- somewhere in code
if (dialogInfo) then
    print('Last dalog text:', dialogInfo.text);
end
 

Ancwork

Участник
43
3
to call global 'str' (a nil value)

Что ему ещё не хватает?
local ComboTest = new.int() -- создаём буфер для комбо
local item_list = {'Флуд', 'Оскорбление'} -- создаём таблицу с содержимым списка
local ImItems = imgui.new['const char*'][#item_list](item_list)
local inputField = new.char[256]()
local inputField1 = new.char[256]()

if imgui.BeginTabBar('Tabs') then
if imgui.BeginTabItem('Выдача наказаний') then
if imgui.InputTextWithHint('ID', 'Введите ID', inputField, 256) then
id = inputField
end
if imgui.InputTextWithHint('Время', 'Введите время', inputField1, 256) then
minute = inputField1
end
imgui.Combo('Список', ComboTest, ImItems, #item_list)
if imgui.Button('Выдать мут') then
local message = string.format("/fammute %s %s %s",str(inputField), str(inputField1), item_list[ComboTest[0]+1])
lua_thread.create(function()
sampSendChat(u8:decode(message))
end)
end
 

monolith04

Известный
71
6
Играю-играю, бывает, сверну игру, потом разворачиваю и вот во что превращается окно созданное на mimgui... Да еще и FPS срезается в несколько раз...
В чём же дело? Как исправить?

1723455817484.png
 

Samirca

Участник
152
19
Как установить Moonloader 0.27 Prewiew 3? Я все установил правильно и все-равно не работает
 

fibagr123

Известный
20
2
как отцентровать число в inputint в обычном имгуи, че-то полистали документация и не нашел нужного флага

как посчитать количество строк в InputTextMultiline? попытался с помощью данной либы https://www.blast.hk/threads/147968/ подсчитать кол-во знаков переноса строк:
Lua:
binder[i].text.v:count('[\n]')
но по кд выдает 0, хотя например в методе split - "[\n]" нормально обрабатывается и строка правильно разбивается

to call global 'str' (a nil value)
Я плохо разбираюсь в мимгуи, но вроде чтобы прочитать значение из буфера строки надо использовать: ffi.string(buffer)
 
Последнее редактирование:

North Trees

Участник
39
2
Вечер добрый, хотел бы по интересоваться в написании основных функций скрипта вх. Уточнение вх тип обычный на ники, язык луа я достаточно знаю для этого т. к уже писал скриптики.
 

2elnwndrer.

Известный
59
20
Как хукнуть клисты игроков на радаре и заменить их на картинку, например?
 

MLycoris

На вид оружие массового семяизвержения
Проверенный
1,988
2,190
Вечер добрый, хотел бы по интересоваться в написании основных функций скрипта вх. Уточнение вх тип обычный на ники, язык луа я достаточно знаю для этого т. к уже писал скриптики.
на форуме вх хоть жопой жуй и в большинстве случаев код открыт
в основном используют что-то типа такого

Lua:
-- где нибудь в начале
local font = renderCreateFont('TimesNewRoman', 9, 5)

-- в main
for k, v in pairs(getAllChars()) do
    local cx, cy, cz = getCharCoordinates(v)
    local res, playerId = sampGetPlayerIdByCharHandle(v)
    if res and v ~= PLAYER_PED and isPointOnScreen(cx, cy, cz, 1) then
        local convX, convY = convert3DCoordsToScreen(cx, cy, cz)
        renderFontDrawText(font, sampGetPlayerNickname(playerId), convX, convY, 0xFFFFFFFF)
    end
end
 

North Trees

Участник
39
2
на форуме вх хоть жопой жуй и в большинстве случаев код открыт
в основном используют что-то типа такого

Lua:
-- где нибудь в начале
local font = renderCreateFont('TimesNewRoman', 9, 5)

-- в main
for k, v in pairs(getAllChars()) do
    local cx, cy, cz = getCharCoordinates(v)
    local res, playerId = sampGetPlayerIdByCharHandle(v)
    if res and v ~= PLAYER_PED and isPointOnScreen(cx, cy, cz, 1) then
        local convX, convY = convert3DCoordsToScreen(cx, cy, cz)
        renderFontDrawText(font, sampGetPlayerNickname(playerId), convX, convY, 0xFFFFFFFF)
    end
end
Спасибо)))

Посоветуйте пожалуйста скрипт который при зажатии клавиши флудит другую клавишу. Тип я зажал 1, а скрипт мне флудит 2
 
Последнее редактирование:
  • Нравится
Реакции: MLycoris

fibagr123

Известный
20
2
Спасибо)))

Посоветуйте пожалуйста скрипт который при зажатии клавиши флудит другую клавишу. Тип я зажал 1, а скрипт мне флудит 2
Lua:
if wasKeyPressed(клавиша) and not sampIsCursorActive() then
    setCharKeyDown(клавиша, true)
    wait(100)
    setCharKeyDown(клавиша, false)
end
 
  • Нравится
Реакции: North Trees

uvie

Известный
271
54
how could I make a script so that the police officer would send me a fine and I would automatically accept it?
Lua:
pcall(require, 'sflua')

function isFinePaymentRequestDisplayed()
    for i = 0, sampGetChatStringLength() - 1 do
        local chatText = sampGetChatString(i)
        if string.match(chatText, "jums siūlo moketi bauda: %d+ €. Moketi?") then
            return true
        end
    end
    return false
end

function main()
    repeat wait(0) until isSampAvailable()
    while true do
        wait(0)
        if isFinePaymentRequestDisplayed() then
            sampSendChat("/taip")
        end
    end
end


I only have one, a script, and I don't know how to get the code, where should I click YES from the following tables?

I have creations, sampSendChat, but in chat you don't need to write /yes, to accept the fine you need to press yes in the table
 

Вложения

  • ApplicationFrameHost_FQzr1liIFX.png
    ApplicationFrameHost_FQzr1liIFX.png
    25.2 KB · Просмотры: 13
  • msedge_t54T1aUBsi.png
    msedge_t54T1aUBsi.png
    25 KB · Просмотры: 13

Dimok228

Известный
40
1
Есть у меня скрипт, который нажимает по диалогу сам, но вот хочу модифицировать, не знаю как.
Мне нужно чтобы он не продолжал использование функции когда в диалоге видит определенный текст, то есть когда транспорт в гараже, или если кто-то за рулем
function fdrive(arg)
if #arg == 0 then
sampAddChatMessage("{4682B4}[helper]{FFFFFF 1-8. 9, .", 0xffffff)
end
if tonumber(arg) == 0 then
elseif tonumber(arg) == 1 then
sampSendChat("/family")
sampSendDialogResponse(3109, 1, 4)
sampSendDialogResponse(3123, 1, 0)
sampSendDialogResponse(3124, 1, 1)
elseif tonumber(arg) == 2 then
sampSendChat("/family")
sampSendDialogResponse(3109, 1, 4)
sampSendDialogResponse(3123, 1, 1)
sampSendDialogResponse(3124, 1, 1)
elseif tonumber(arg) == 3 then
sampSendChat("/family")
sampSendDialogResponse(3109, 1, 4)
sampSendDialogResponse(3123, 1, 2)
sampSendDialogResponse(3124, 1, 1)
elseif tonumber(arg) == 4 then
sampSendChat("/family")
sampSendDialogResponse(3109, 1, 4)
sampSendDialogResponse(3123, 1, 3)
sampSendDialogResponse(3124, 1, 1)
elseif tonumber(arg) == 5 then
sampSendChat("/family")
sampSendDialogResponse(3109, 1, 4)
sampSendDialogResponse(3123, 1, 4)
sampSendDialogResponse(3124, 1, 1)
elseif tonumber(arg) == 6 then
sampSendChat("/family")
sampSendDialogResponse(3109, 1, 4)
sampSendDialogResponse(3123, 1, 5)
sampSendDialogResponse(3124, 1, 1)
elseif tonumber(arg) == 7 then
sampSendChat("/family")
sampSendDialogResponse(3109, 1, 4)
sampSendDialogResponse(3123, 1, 6)
sampSendDialogResponse(3124, 1, 1)
elseif tonumber(arg) == 8 then
sampSendChat("/family")
sampSendDialogResponse(3109, 1, 4)
sampSendDialogResponse(3123, 1, 7)
sampSendDialogResponse(3124, 1, 1)
end
end
Вот менюшка
image.png
 
Последнее редактирование: