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

Andrye2323

Новичок
10
2
Подскажите пожалуйста, как взаимодействовать с диалогом?
Например, если открылся диалог #1 и я нажал на 1 строку в диалоге, то в чат писало что я выбрал строку #1, если выбрал вторую строку - в чат пишет что выбрана строка #2. А так же с кнопками, если нажата кнопка #1, в чат пишет что нажата кнопка #1.
Объясните пожалуйста или дайте шаблон какой-нибудь.


И еще хотелось бы узнать, как выводить текст из диалога в текстовый документ, а так же как делать поиск определенного текста в текстовом документе.
 
Последнее редактирование модератором:

imring

Ride the Lightning
Всефорумный модератор
2,355
2,516
И еще хотелось бы узнать, как выводить текст из диалога в текстовый документ
Lua:
samp = require 'samp.events'

function samp.onShowDialog(id, style, title, button1, button2, text)
    local file = io.open('moonloader/dialog '..id..'.txt', 'w')
    file:write(text)
    file:close()
end
а так же как делать поиск определенного текста в текстовом документе.
string.find
Подскажите пожалуйста, как взаимодействовать с диалогом?
Например, если открылся диалог #1 и я нажал на 1 строку в диалоге, то в чат писало что я выбрал строку #1, если выбрал вторую строку - в чат пишет что выбрана строка #2. А так же с кнопками, если нажата кнопка #1, в чат пишет что нажата кнопка #1.
Объясните пожалуйста или дайте шаблон какой-нибудь.
Lua:
samp = require 'samp.events'

function samp.onSendDialogResponse(id, button, list, input)
    print('ID '..id)
    print('Button '..button)
    print('List '..list)
    print('Input '..input)
end
Как сделать многократную активацию/деактивацию скрипта по команде. Не функции.
Lua:
sampRegisterChatCommand('test' function() bool = not bool end)
 
Последнее редактирование:
  • Нравится
Реакции: AnWu

Drinkins

Участник
38
0
Как сделать рандом на sampSendChat?
Чтобы в чат выводилось либо "текст 2", либо "второй текст"
 

#Northn

Police Helper «Reborn» — уже ШЕСТЬ лет!
Всефорумный модератор
2,635
2,485
Как сделать многократную активацию/деактивацию. Не именно отдельной функции, а всего скрипта
Разве что сделать второй скрипт и запускать через него, ибо идёт выгрузка и загрузка.
Если нет скрипта - то откуда скрипту знать что нужно выгружаться?
Это тоже самое что и "как включить двигатель не имея его?"
 

MEXANI3M

Новичок
49
8
помогите, пожалуйста, посмотрел справочник по lua(Справочное руководство по языку Lua 5.1 :: 5.7 - Обработка таблиц(http://www.lua.ru/doc/5.7.html)), написал, вродь всё правильно, нифига:
[20:11:58.246339] (error) VehicleRecordingPath: ...Program files\San Andreas MultiPlayer\moonloader\VRP.lua:86: bad argument #1 to 'close' (FILE* expected, got string)
stack traceback:
[C]: in function 'close'
...Program files\San Andreas MultiPlayer\moonloader\VRP.lua:86: in function 'vrp_rec'
...Program files\San Andreas MultiPlayer\moonloader\VRP.lua:46: in function <...Program files\San Andreas MultiPlayer\moonloader\VRP.lua:42>
 

Вложения

  • VRP.lua
    2.6 KB · Просмотры: 7

Nishikinov

Известный
148
34
Использую такой код чтобы выводить текст из чата на экран:
Lua:
Ранее находится таблица, в которую идут строки из чата.

function askDraw()
if #ask > 10 then
    table.remove(ask, 1)
end
local x = 5
local y = posY/2
for _, v in ipairs(ask) do
    renderFontDrawText(font, v, x, y, 0xFFFBEC5D)
    y = y + 20
    end
end

В мэйне функция вызывается.

Каким образом можно изменить цвет выводимой строки при условии, когда она уже находится на экране?
 

AnWu

Guardian of Order
Всефорумный модератор
4,690
5,190
Использую такой код чтобы выводить текст из чата на экран:
Lua:
Ранее находится таблица, в которую идут строки из чата.

function askDraw()
if #ask > 10 then
    table.remove(ask, 1)
end
local x = 5
local y = posY/2
for _, v in ipairs(ask) do
    renderFontDrawText(font, v, x, y, 0xFFFBEC5D)
    y = y + 20
    end
end

В мэйне функция вызывается.

Каким образом можно изменить цвет выводимой строки при условии, когда она уже находится на экране?
Смысле? Просто меняй цвет в renderFontDrawText(). Я не совсем понимаю вопроса.
 

Nishikinov

Известный
148
34
Смысле? Просто меняй цвет в renderFontDrawText(). Я не совсем понимаю вопроса.
Типа смотри, сама строка берется из таблицы и выводится на экран циклом. Нужно сделать проверку на определенный текст в другой таблице, изменив цвет текста текущей строки в этой таблице. Я не совсем пойму как правильно сделать эту проверку, чтобы цикл первой таблицы не застрял на одном месте и не ждал результатов проверки, а выполнял ее в фоновом режиме.

Проще говоря, если определенный текст совпадает и там и там, то в первой строку с этим текстом нужно окрасить в другой цвет.
 

AnWu

Guardian of Order
Всефорумный модератор
4,690
5,190
Типа смотри, сама строка берется из таблицы и выводится на экран циклом. Нужно сделать проверку на определенный текст в другой таблице, изменив цвет текста текущей строки в этой таблице. Я не совсем пойму как правильно сделать эту проверку, чтобы цикл первой таблицы не застрял на одном месте и не ждал результатов проверки, а выполнял ее в фоновом режиме.

Проще говоря, если определенный текст совпадает и там и там, то в первой строку с этим текстом нужно окрасить в другой цвет.
Самый простой пример:
Lua:
for k, v in ipairs(table1) do
    local color = 0xFFFFC700
    for _, vv in ipairs(table2) do
        if tostring(v) == tostring(vv) then
            color = 0xFFFFFFFF
        end
    end
    renderFontDrawText(--[[params]], color)
end
 

imring

Ride the Lightning
Всефорумный модератор
2,355
2,516
как можно узнать, что включён худ?