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

Petr_Sergeevich

Известный
Проверенный
707
297
Привет, нужна помощь. Вообще не шарю в скриптинге.
Решил сделать бинд на /healme. Самый простой бинд, скрипт в несколько строк.
Бинд то я сделал, но появилась проблема. Бинд юзается даже во время чата, решил это исправить, но понятия вообще не имею как это сделать.
Сам скрипт:
require "lib.moonloader"

function main()
if not isSampfuncsLoaded() or not isSampLoaded() then return end
while not isSampAvailable() do wait(100) end
while true do
wait(0)
if bool result = sampIsChatInputActive()
bool result == false then
if isKeyJustPressed(VK_R) then
sampSendChat("/healme")
end
end
end
end



PS: соре, хз как вставлять не по рукожопски скрипт
напиши я це делать

Lua:
require "lib.moonloader"

function main()
    while not isSampAvailable() do wait(0) end
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    while true do
        wait(0)
        if not sampIsChatInputActive() then
            if isKeyJustPressed(VK_R) then
                sampSendChat("/healme")
            end    
        end
    end
end
 

ШPEK

Известный
1,474
525
Пытаюсь сделать замену текста отправленного игроком, суть проблемы в return. Когда делаю просто return 'txt' - все ок, а когда делаю так(спойлер)
Lua:
function event.onSendChat(message)
if thccfg.settings.togtag then
    if message:sub(str, 1,3) == '/tr'     then
        submes = message:sub(str, 4,message:len)
        message = string.format('/tr [%s]%s',thccfg.settings.tag,submes)
        return message
    end
end
end
Выводит ошибку: : function arguments expected near ')'. Как исправить?


Lua:
function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    while not isSampAvailable() do wait(100) end
    while true do
    wait(0)
        if bool result = sampIsChatInputActive()
        bool result == false then
      if isKeyJustPressed(VK_R) and not sampIsChatInputActive then
      sampSendChat("/healme")   
      end
        end
    end
end
Lua:
function event.onSendChat(message)
    if thccfg.settings.togtag and message:find('/tr .+') then
        return {string.format("/tr [%s] %s", thccfg.settings.togtag, message:match("/tr (.+)"))}
    end
end

Привет, нужна помощь. Вообще не шарю в скриптинге.
Решил сделать бинд на /healme. Самый простой бинд, скрипт в несколько строк.
Бинд то я сделал, но появилась проблема. Бинд юзается даже во время чата, решил это исправить, но понятия вообще не имею как это сделать.
Сам скрипт:
require "lib.moonloader"

function main()
if not isSampfuncsLoaded() or not isSampLoaded() then return end
while not isSampAvailable() do wait(100) end
while true do
wait(0)
if bool result = sampIsChatInputActive()
bool result == false then
if isKeyJustPressed(VK_R) then
sampSendChat("/healme")
end
end
end
end



PS: соре, хз как вставлять не по рукожопски скрипт
напиши я це делать
Lua:
function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    while not isSampAvailable() do wait(100) end
    while true do
        wait(0)
        if isKeyJustPressed(VK_R) then
            sampSendChat("/healme")
        end
    end
end
p.s lua не ахк. sampSendChat отправляет rpc
 

Petr_Sergeevich

Известный
Проверенный
707
297
Atom сожрал ~2к строк кода после перезагрузки. Хорошо, что бэкапы делаю каждый час, но всё же, как такое возможно? Кто сталкивался с подобным? Как боролись с этим? Просто перезагрузил проект и его как и не было..
 

ШPEK

Известный
1,474
525
Atom сожрал ~2к строк кода после перезагрузки. Хорошо, что бэкапы делаю каждый час, но всё же, как такое возможно? Кто сталкивался с подобным? Как боролись с этим? Просто перезагрузил проект и его как и не было..
использовать notepad++
 

madrasso

Потрачен
883
325
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
выгрузить текущий скрипт ( убить ) как?

Atom сожрал ~2к строк кода после перезагрузки. Хорошо, что бэкапы делаю каждый час, но всё же, как такое возможно? Кто сталкивался с подобным? Как боролись с этим? Просто перезагрузил проект и его как и не было..
на косячил в коде, ошибка - продолжения кода не будет, так уж устроен атом))
Прошел через это)
 

NeathA

Новичок
45
4
Ребят, подскажите, в чем косяк. Делал авторыбалку для даймонда, возникли проблемы с автокликаньем ЛКМ и ПКМ. В чем косяк: сначала скрипт работает идеально, через 5 минут начинаются затупы, причем как у скрипта, так и у самого меня. Т.е. скрипт жмет ЛКМ - сервер этого не ловит, скрипт не видит текст сервера и просто ничего не делает. Жму сам ЛКМ - только раза с третьего это проходит на сервер. Скрипт подхватывает текст, раза 2 прокликивает и опять ждет. И снова вся каша с самого начала. В чем косяк? Проблема не только у меня, а еще и у товарищей. Средний пинг - 50. Без скрипта все вроде бы нормально.
Lua:
function sampev.onDisplayGameText(st, ti, txtt)
        if eba and txtt:find("PED_FIREWEAPON") then
            setGameKeyState(17, 128)
        end
        if eba and txtt:find("PED_LOCK_TARGET") then
            setGameKeyState(6, 128)
        end
end
Все еще ищу ответ.
 

TheDed

Участник
99
14
Какой командой можно выйти из игры посредством краша? Помню есть такая функция связанная с "callfunction", но найти её не могу.
 

wD.D159

Известный
Друг
446
480
Не крашит
Lua:
script_properties('work-in-pause')

local myObjsModel = {19320, 770, 12961, 3525, 9114, 3092, 19339, 2907, 2908, 3524, 2589, 19126, 1736, 3594, 849, 4988, 2906, 12957, 2953, 1369, 16410, 853, 18725, 735, 3437, 1251, 3096, 1568, 19425, 19465, 1492, 19377, 19464, 19355, 1723, 1256, 19353, 19445, 11472, 19362, 14387, 1494, 19383, 19176, 19454, 19447, 7313, 751, 750, 7588, 3362, 1260, 4729, 970, 19121, 19295, 748, 16121, 5992, 18714, 8483, 649, 691, 2587, 8397, 3660, 3361, 1476, 970, 2886, 8657, 1472, 3050, 19641, 1422, 3578, 1293, 1255, 642, 1223, 2773, 1570, 358, 645, 792, 3374, 17037, 619, 629, 1280, 4597, 9241, 1597, 1825, 11496, 955, 805, 3884, 19853, 3593, 8407, 749, 1482, 2973, 3277, 7494, 19852, 3522, 1216, 639, 1841, 640, 1432, 3606, 1481, 3066, 1724, 3794, 19166, 11292, 19544, 1461, 1612, 968, 964, 2111, 3795, 1431, 3797, 360, 353, 19296, 362, 321, 2810, 3515, 2779, 2681, 1212, 1824, 1978, 2188, 2898, 14872, 1827, 356, 349, 355, 2232, 2104, 2630, 2628, 2627, 1360, 2744, 9958, 1215, 1305, 758, 878, 14467, 1278, 653}

function main()
    if not isSampLoaded() then return end
    while not isSampAvailable() do wait(100) end
    while true do
        wait(0)
        for i,v in ipairs(getAllObjects()) do
            if doesObjectExist(v) and isObjectInArea2d(v, -152.0783, 1247.5969, -1348.4775, 2157.8174, true) then
                local model = getObjectModel(v)
                for i1, v1 in ipairs(myObjsModel) do
                    if model == v1 then
                        deleteObject(v)
                    end
                end
            end
        end
    end
end
Все равно крашит.

Ребят, вот не знаю у кого как, но при использовании хука объектов, у меня зависает игра через определенное время.

Lua:
function SE.onCreateObject(id, data)
    return false
end

Но если использую блок РПЦ пакета, то все нормально.

Lua:
function onReceiveRpc(id, bs)
    if id == 44 then
        return false
    end
end

В чем проблема может быть? В логах все хорошо, игра просто зависает и приходится убивать процесс.
 

RedApple

Известный
41
0
Как с помощью LUA отправить в чат команду, но не серверную, а созданную CLEO скриптом?
Или мб другое решение есть как активировать клео скрипт .lua скриптом
 

4k | ST1CK

Участник
80
13
Посоветуйте где изучить lua,в ютубе вбивал,но там в основном ничего не понятно,и автор долб**б накуренный
 

tlwsn

Известный
537
85
Как с помощью LUA отправить в чат команду, но не серверную, а созданную CLEO скриптом?
Или мб другое решение есть как активировать клео скрипт .lua скриптом
Lua:
sampProcessChatInput(zstring text)  -- 0C8F
Посоветуйте где изучить lua,в ютубе вбивал,но там в основном ничего не понятно,и автор долб**б накуренный
https://blast.hk/threads/22707/
 

Fomikus

Известный
Проверенный
475
345
Как узнать координаты маркера? ( Те что на работе автобусника, где-то даже в гонках с финишем которые)