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

auf.exe

Участник
41
12
Как зделать такой стиль имгуи?
1637242235914.png
 

sep

Известный
714
79
что не так подскажите

attempt to index local 'text' (a nil value)
stack traceback:
in function 'render_text'
in function 'TextColoredRGB'
in function 'OnDrawFrame'
imgui.lua:1377: in function \lib\imgui.lua:1366>
Script died due to an error. (0A89BFFC)
=============================================================================================
почему тут не работает wait
сразу флудит sampAddChatMessage а только потом срабатывает sampSendChat
а я хочу чтобы 1 раз sampAddChatMessage далее sampSendChat задержка и по кругу пока есть люди


function sampev.onPlayerStreamIn(playerId, team, model, position, rotation, color, fightingStyle)
lua_thread.create(function()
wait(0)
if aaaa then
sampAddChatMessage
sampSendChat
wait(1000)
end
end)
end

сраббатывает так
sampAddChatMessage
sampAddChatMessage
sampAddChatMessage

sampSendChat
sampSendChat
sampSendChat

а надо
sampAddChatMessage
sampSendChat
и по кругу пока есть люди НАДЕЮСЬ ПОНЯТНО РАСКАЗАЛ
актуально
 

qdIbp

Автор темы
Проверенный
1,438
1,199
Lua:
require "lib.moonloader"
local on = require "lib.samp.events"

aaaa = false
bbbb = false
sms = sampAddChatMessage

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
        sampRegisterChatCommand('spam',function() aaaa = not aaaa bbbb = not bbbb sms('ohae',-1) end)
        sampRegisterChatCommand('ch', function() print(aaaa) print(bbbb) end)
    while true do wait(0)
        function on.onPlayerStreamIn(playerId, team, model, position, rotation, color, fightingStyle)
            lua_thread.create(function()
                if aaaa then
                    sampAddChatMessage('hi pipl',-1) aaaa = not aaaa end
                if bbbb then
                    sampSendChat('/azaza') wait(3000)
                end
            end)
        end
    end
end
Будет работать как появиться человек на горизонте и если bbbb = true
 
  • Нравится
Реакции: sep

_Nelit_

Потрачен
109
39
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Как сделать такой прикол как у космо в банк хелпере? /me {sex:открыл|открыла} на планшете базу данных. Я про это если что {sex:открыл|открыла}
 

Vadimka3636

Известный
55
36
Как сделать такой прикол как у космо в банк хелпере? /me {sex:открыл|открыла} на планшете базу данных. Я про это если что {sex:открыл|открыла}
не знаю как оно должно работать, но я бы сделал так:
Кусок кода:
if sex == 0 then -- если пол 0(типо мужской)
    sexstring = 'открыл'
else -- в ином случае
    sexstring = 'открыла'
end
sampSendChat(string.format('/me %s на планшете базу данных', sexstring))
В моем коде возможны ошибки(первую исправил, надеюсь больше нет)
 

qdIbp

Автор темы
Проверенный
1,438
1,199
Как сделать такой прикол как у космо в банк хелпере? /me {sex:открыл|открыла} на планшете базу данных. Я про это если что {sex:открыл|открыла}
Lua:
    if msg:find('{sex:%A+|%A+}') then
        local male, female = msg:match('{sex:(%A+)|(%A+)}')
        if cfg.main.sex == 1 then
            local returnMsg = msg:gsub('{sex:%A+|%A+}', male, 1)
            sampSendChat(tostring(returnMsg))
            return false
        else
            local returnMsg = msg:gsub('{sex:%A+|%A+}', female, 1)
            sampSendChat(tostring(returnMsg))
            return false
        end
    end
Тупо разрыв шаблона, все так просто и прикольно оформлено
 
  • Нравится
Реакции: _Nelit_

tsunamiqq

Участник
433
17
Хукать диалоги и парсить текст + отправлять sampSendDialogResponse при необходимости


Делай сохранение на json и не будешь знать проблем. inicfg не может сохранять массивы без ключа
Сможешь научить? Если не сложно.
 

qdIbp

Автор темы
Проверенный
1,438
1,199
Код:
function sampev.onSendCommand(cmd)
    if cmd:find('{sex:%A+|%A+}') then
        local male, female = cmd:match('{sex:(%A+)|(%A+)}')
        if cfg.Settings.sex == 1 then
            local returnMsg = cmd:gsub('{sex:%A+|%A+}', male, 1)
            sampSendChat(tostring(returnMsg))
            return false
        else
            local returnMsg = cmd:gsub('{sex:%A+|%A+}', female, 1)
            sampSendChat(tostring(returnMsg))
            return false
        end
    end
end
Вроде я такой же скидывал, не?
Lua:
    if msg:find('{sex:%A+|%A+}') then
        local male, female = msg:match('{sex:(%A+)|(%A+)}')
        if cfg.main.sex == 1 then
            local returnMsg = msg:gsub('{sex:%A+|%A+}', male, 1)
            sampSendChat(tostring(returnMsg))
            return false
        else
            local returnMsg = msg:gsub('{sex:%A+|%A+}', female, 1)
            sampSendChat(tostring(returnMsg))
            return false
        end
    end
Тупо разрыв шаблона, все так просто и прикольно оформлено
Хотя разница колоссальная
 
  • Нравится
Реакции: _Nelit_

_Nelit_

Потрачен
109
39
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
не знаю как оно должно работать, но я бы сделал так:
Кусок кода:
if sex == 0 then -- если пол 0(типо мужской)
    sexstring = 'открыл'
else -- в ином случае
    sexstring = 'открыла'
end
sampSendChat(string.format('/me %s на планшете базу данных', sexstring))
В моем коде возможны ошибки(первую исправил, надеюсь больше нет)
спасибо, говнокод не нужен)
 

W1ll04eison

Известный
330
19
У меня есть скрипт, который делает доклад в рацию когда ведёшь поставки в LVA.
Т.е ты когда выгрузился в какой то фракции (лспд, лвпд, сфпд и т.д) то в чат пишет:
«Боеприпасы доставлены на склад LSPD: 85000/10000 (эти цифры это заполненность склада)» .
Через samp events я сделал так что-бы скрипт искал данную строку для всех фракций, типо как строка появляется определённая - он делает авто доклад, так вот, как сделать округление заполненности склада в долкдаде, к примеру заполненность будет 66000/10000 то скрипт напишет «66 тонн», но, как сделать так что-бы он округлил, вместо "66" написал бы "70".
Если заполненность склада "37", "78", 46" и т.д то он округлил бы в большую сторону.
А если "22", "43", "52" и т.д то округлил бы в меньшую сторону.
 

sep

Известный
714
79
где-то тут видел вроде но в 457 странице на найдёшь
как запретить отправление серверу команды

1)например у меня есть чит на sampRegisterChatCommand('КОМАНДА', function(param) ИТД
НАК СДЕЛАТАТЬ ТАК ЧТОБЫ В ЛОГАХ У СЕРВАРА НЕ БЫЛО ТО ЧТО Я ЭТУ КОМАНДУ ВВОДИЛ ?

2) ЕСЛИ КОМАНДА В АСИ ИЛИ СФ ПЛАГИНЕ МОЖНО ЗАПРЕТИТЬ ЕГО ОТПРАВЛЕНИЕ СЕРВЕРУ НО ТАК ЧТОБЫ СКРИПТ РАБОТАЛ
без изменение аси и сф а только в луа ?


У меня есть скрипт, который делает доклад в рацию когда ведёшь поставки в LVA.
Т.е ты когда выгрузился в какой то фракции (лспд, лвпд, сфпд и т.д) то в чат пишет:
«Боеприпасы доставлены на склад LSPD: 85000/10000 (эти цифры это заполненность склада)» .
Через samp events я сделал так что-бы скрипт искал данную строку для всех фракций, типо как строка появляется определённая - он делает авто доклад, так вот, как сделать округление заполненности склада в долкдаде, к примеру заполненность будет 66000/10000 то скрипт напишет «66 тонн», но, как сделать так что-бы он округлил, вместо "66" написал бы "70".
Если заполненность склада "37", "78", 46" и т.д то он округлил бы в большую сторону.
А если "22", "43", "52" и т.д то округлил бы в меньшую сторону.
я могу написать чушь дождись ответа толковых но лутше что то чем ничего

попробуй так ( pr переменая с патронами )
if pr =< 10 then
код
elseif pr =< 20 then
итд
end
итд
 
Последнее редактирование: