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

Thunders

Новичок
1
0
Умная выдача наказания за помеху.
Почему команда не выполняет действие? Прописываю /emsp "id игрока", но процессов нету, хотя игрок должен быть отправлен за карту (в деморган).

Lua:
function main()
    repeat wait(0) until isSampAvailable()
    sampRegisterChatCommand('emsp', cmd)
    while true do wait(0)
    end  
        if start then
            sampSendChat('/ajail '..ID' 1 Помеха EMS')
           end
           
        start = false
        end


function cmd(param)
    ID = param
    start = true
end
 

Myradov|

Известный
361
106
Простите за очень тупой вопрос, но как сменить кодировку в VS Code?) Впервые юзаю эту прогу
 

Vespan

loneliness
Проверенный
2,105
1,639
Lua:
-- while true do wait(0)
    for i = 0, sampGetMaxPlayerId() do
        if sampIsPlayerConnected(i) then
            local result, ped = sampGetCharHandleBySampPlayerId(i)
            if result then
            local x, y, z = getCharCoordinates(ped)
                sampCreate3dTextEx(100, sampGetPlayerNickname(i), -1, x, y, z, 150, true, -1, -1)
            end
        end
    end
Когда игрок выходит из игры (в зоне стрима) его ник остается,как это решить?
 

Vespan

loneliness
Проверенный
2,105
1,639
Помогите,прошу.
Lua:
   -- while true do
   local result, button, list, input = sampHasDialogRespond(100) -- ТП
    tp_list = [[
{FFFF00}Избраное{FFFFFF}
Зона Для Админов
Мэрия
Банк
Vine Wood
КПП LS-SF
Гетто
Зона 51
Заброшенный Аэропорт
{FFFF00}Города {FFFFFF}>>
{003399}Гос.Орг {FFFFFF}>>.
{333333}Мафии {FFFFFF}>>
{FF0000}Банды {FFFFFF}>>]]
    if result then
        sampCloseCurrentDialogWithButton(0) -- ХУЛИ НЕ ЗАКРЫВАЕТСЯ ДИАЛОГ????
        if list == 0 then -- Избраное
            sampShowDialog(106, 'TP List|{FFFF00}Избраное{FFFFFF}', 'Создать точку\nТП К точке', 'ok', 'Close', 2)
        elseif list == 1 then -- зона для админов
            setCharCoordinates(Pped, -2866, 2426, 201)
        elseif list == 2 then -- мэрия
            setCharCoordinates(Pped, 1479, -1739, 13)
        elseif list == 3 then -- банк
            setCharCoordinates(Pped, 1417, -1707, 13)
        elseif list == 4 then --MW
            setCharCoordinates(Pped, 1423, -845, 49)
        elseif list == 5 then -- kpp
            setCharCoordinates(Pped, 76, -1536, 8)
        elseif list == 6 then -- гетто
            setCharCoordinates(Pped, 2184, -1672, 14)
        elseif list == 7 then  -- Зона 51
            setCharCoordinates(Pped, 121, 1905, 17)
        elseif list == 8 then  -- Заброшенный Аэропорт
            setCharCoordinates(Pped, 424, 2525, 16)
        elseif list == 9 then -- города >>
            sampShowDialog(101, 'TP List | Города', 'Los Santos\nSan Fierro\nLas Venturas', 'ok', 'Close', 2)
        elseif list == 10 then -- Гос.Орг >>
            sampShowDialog(102, 'TP List | {003399}Гос.Орг.', 'LSPD/SWAT\nRCSD\nLSFD\nFBI\nSan News\nArmy LS\nПра-Во', 'ok', 'Close', 2)
        elseif list == 11 then
            sampShowDialog(103, 'TP List | {333333}Мафии', 'RM\nLCN\nYakuza\nHitman', 'ok', 'Close', 2)
        elseif list == 12 then
            sampShowDialog(104, 'TP List | {00FFFF}Банды', 'Grove Street\nVagos\nAztec\nRifa\nBallas', 'ok', 'Close', 2)
        end
    end
 

CaJlaT

Овощ
Модератор
2,807
2,617
Помогите,прошу.
Lua:
   -- while true do
   local result, button, list, input = sampHasDialogRespond(100) -- ТП
    tp_list = [[
{FFFF00}Избраное{FFFFFF}
Зона Для Админов
Мэрия
Банк
Vine Wood
КПП LS-SF
Гетто
Зона 51
Заброшенный Аэропорт
{FFFF00}Города {FFFFFF}>>
{003399}Гос.Орг {FFFFFF}>>.
{333333}Мафии {FFFFFF}>>
{FF0000}Банды {FFFFFF}>>]]
    if result then
        sampCloseCurrentDialogWithButton(0) -- ХУЛИ НЕ ЗАКРЫВАЕТСЯ ДИАЛОГ????
        if list == 0 then -- Избраное
            sampShowDialog(106, 'TP List|{FFFF00}Избраное{FFFFFF}', 'Создать точку\nТП К точке', 'ok', 'Close', 2)
        elseif list == 1 then -- зона для админов
            setCharCoordinates(Pped, -2866, 2426, 201)
        elseif list == 2 then -- мэрия
            setCharCoordinates(Pped, 1479, -1739, 13)
        elseif list == 3 then -- банк
            setCharCoordinates(Pped, 1417, -1707, 13)
        elseif list == 4 then --MW
            setCharCoordinates(Pped, 1423, -845, 49)
        elseif list == 5 then -- kpp
            setCharCoordinates(Pped, 76, -1536, 8)
        elseif list == 6 then -- гетто
            setCharCoordinates(Pped, 2184, -1672, 14)
        elseif list == 7 then  -- Зона 51
            setCharCoordinates(Pped, 121, 1905, 17)
        elseif list == 8 then  -- Заброшенный Аэропорт
            setCharCoordinates(Pped, 424, 2525, 16)
        elseif list == 9 then -- города >>
            sampShowDialog(101, 'TP List | Города', 'Los Santos\nSan Fierro\nLas Venturas', 'ok', 'Close', 2)
        elseif list == 10 then -- Гос.Орг >>
            sampShowDialog(102, 'TP List | {003399}Гос.Орг.', 'LSPD/SWAT\nRCSD\nLSFD\nFBI\nSan News\nArmy LS\nПра-Во', 'ok', 'Close', 2)
        elseif list == 11 then
            sampShowDialog(103, 'TP List | {333333}Мафии', 'RM\nLCN\nYakuza\nHitman', 'ok', 'Close', 2)
        elseif list == 12 then
            sampShowDialog(104, 'TP List | {00FFFF}Банды', 'Grove Street\nVagos\nAztec\nRifa\nBallas', 'ok', 'Close', 2)
        end
    end
2 вопроса.
1. Почему ты текст задаёшь в беск.цикле?
2. Зачем ты пытаешься закрыть диалог, на который уже пришёл респонс (игрок его закрыл)
 

CaJlaT

Овощ
Модератор
2,807
2,617
Я просто down,не разбираюсь в диалогах. Может дать пример :(
Тоже не идеал....

Lua:
sampRegisterChatCommand('xplist', function()
    if dtext == 'Клан\tИгроков\tОпыт игроков' then sampAddChatMessage(tag..'Ошибка, используйте {ff0000}/checkxp [Тысячи].', -1) return end
    sampShowDialog(16171, "{FFFFFF}Игроки опытом больше, чем {FF0000}"..xpcheck, dtext, "Выбрать", "Закрыть", 5)
    lua_thread.create(checkerdialog)
end)



function checkerdialog()
    while sampIsDialogActive() do
        wait(0)
        local result, button, list, input = sampHasDialogRespond(16171)
        if result then
            local playerss = {}
            local selectclan = 0
            local dptext = 'Игрок\tОпыт'
            if button == 1 then
                local listtext = sampGetListboxItemText(sampGetDialogText(),list+1)
                selectclancolor, selectclan = listtext:match('%{(.+)%}(.+)    %d+    %d+')
                players = clans[selectclan]
                for k, v in pairs(players) do
                    if type(v) == 'table' then
                        for kk, vv in pairs(v) do
                            if sampIsPlayerConnected(idbynick(vv.nick)) and vv.clan == selectclan then
                                if idbynick(vv.nick) == vv.id then
                                    playerss[#playerss+1] = {text = vv.text, xp = vv.xp}
                                else
                                    local replace = vv.text:gsub("%[(%d+)%]", '['..idbynick(vv.nick)..']')
                                    playerss[#playerss+1] = {text = replace, xp = vv.xp}
                                end
                            else
                                local replace = vv.text:gsub('%[(%d+)%]', '{afafaf} [Не в сети]{FFFFFF}')
                                playerss[#playerss+1] = {text = replace, xp = vv.xp}
                            end
                        end
                    end
                end
                table.sort(playerss, function(a, b) return a.xp > b.xp end)
                for k,v in pairs(playerss) do
                    dptext = dptext..'\n'..v.text
                end
                sampShowDialog(16172, "{FFFFFF}Игроки в клане {"..selectclancolor.."}"..selectclan.."{FFFFFF}, с опытом больше {FF0000}"..xpcheck, dptext, "Назад", "Закрыть", 5)
                lua_thread.create(checkerdialog2)
            end
        end
    end
end
function checkerdialog2()
    while sampIsDialogActive() do
        wait(0)
        local result, button, list, input = sampHasDialogRespond(16172)
        if result then
            if button == 1 then
                sampShowDialog(16171, "{FFFFFF}Кланы с игроками, у которых опытом больше, чем {FF0000}"..xpcheck, dtext, "Выбрать", "Закрыть", 5)
                lua_thread.create(checkerdialog)
            end
        end
    end
end
и id указывай побольше, может у сервера такой id используется
 

Rei

Известный
Друг
1,599
1,636
подскажите регулярки на отлов и удаление пустых строчек, а то у меня не выходит
удаляется что угодно, кроме нужного
1593095518390.png
 

CaJlaT

Овощ
Модератор
2,807
2,617
подскажите регулярки на отлов и удаление пустых строчек, а то у меня не выходит
удаляется что угодно, кроме нужного
Посмотреть вложение 60351
Lua:
local text = ''
for word in io.lines(getWorkingDirectory()..'\\test.txt') do
    if #word ~= 0 and word ~= '' then text = text..word..'\n' end
end
local file = io.open(getWorkingDirectory()..'\\test.txt', 'w')
file:write(text)
file:close()
1593096857978.png
1593096899025.png
 
  • Нравится
Реакции: Rei