Вопросы по 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
 
Последнее редактирование:
1,417
1,029
Подскажите как сделать игнор определённых сообщений на LuA RakBot ?
Lua:
function onPrintLog(str)
    if str:find('привет') then return true end
end
@Bogach
Lua:
local sampev = require 'lib.samp.events'
NONRPMSG = {}
local russian_characters = {
    [168] = 'Ё', [184] = 'ё', [192] = 'А', [193] = 'Б', [194] = 'В', [195] = 'Г', [196] = 'Д', [197] = 'Е', [198] = 'Ж', [199] = 'З', [200] = 'И', [201] = 'Й', [202] = 'К', [203] = 'Л', [204] = 'М', [205] = 'Н', [206] = 'О', [207] = 'П', [208] = 'Р', [209] = 'С', [210] = 'Т', [211] = 'У', [212] = 'Ф', [213] = 'Х', [214] = 'Ц', [215] = 'Ч', [216] = 'Ш', [217] = 'Щ', [218] = 'Ъ', [219] = 'Ы', [220] = 'Ь', [221] = 'Э', [222] = 'Ю', [223] = 'Я', [224] = 'а', [225] = 'б', [226] = 'в', [227] = 'г', [228] = 'д', [229] = 'е', [230] = 'ж', [231] = 'з', [232] = 'и', [233] = 'й', [234] = 'к', [235] = 'л', [236] = 'м', [237] = 'н', [238] = 'о', [239] = 'п', [240] = 'р', [241] = 'с', [242] = 'т', [243] = 'у', [244] = 'ф', [245] = 'х', [246] = 'ц', [247] = 'ч', [248] = 'ш', [249] = 'щ', [250] = 'ъ', [251] = 'ы', [252] = 'ь', [253] = 'э', [254] = 'ю', [255] = 'я',
}

function main()
    repeat wait(0) until isSampAvailable()
    local fmg = io.open("moonloader\\AntiMG\\MG.txt","r")
    if fmg ~= nil then
        for line in fmg:lines() do
            table.insert(NONRPMSG, line)
        end
        fmg:close()
    end
    sampRegisterChatCommand('nrp', function()
        mgOn = not mgOn
        sampAddChatMessage((mgOn and 'On' or 'Off'), -1)
    end)
    wait(-1)
end

function tolower_rus(s)
    s = s:lower()
    local strlen = s:len()
    if strlen == 0 then return s end
    s = s:lower()
    local output = ''
    for i = 1, strlen do
        local ch = s:byte(i)
        if ch >= 192 and ch <= 223 then -- upper russian characters
            output = output .. russian_characters[ch + 32]
        elseif ch == 168 then -- Ё
            output = output .. russian_characters[184]
        else
            output = output .. string.char(ch)
        end
    end
    return output
end

function sampev.onSendChat(message)
    if mgOn then
        local messageL = (tolower_rus(message))
        for _, v in ipairs(NONRPMSG) do
        local nrpmessage = (tolower_rus(v))
            if messageL:find(nrpmessage) then
                sampSendChat("/n "..message)
                return false
            end
        end
    end
end

В логах тишина. Я вот, кстати, выше смотрел вопросы у людей, у Тузика те же проблемы в ShowDialog. Похоже, она не работает, я хз.
скинь лог при работе скрипта, у меня лично все работает
 
Последнее редактирование:

Bogach

Активный
558
27
local russian_characters = { [168] = 'Ё', [184] = 'ё', [192] = 'А', [193] = 'Б', [194] = 'В', [195] = 'Г', [196] = 'Д', [197] = 'Е', [198] = 'Ж', [199] = 'З', [200] = 'И', [201] = 'Й', [202] = 'К', [203] = 'Л', [204] = 'М', [205] = 'Н', [206] = 'О', [207] = 'П', [208] = 'Р', [209] = 'С', [210] = 'Т', [211] = 'У', [212] = 'Ф', [213] = 'Х', [214] = 'Ц', [215] = 'Ч', [216] = 'Ш', [217] = 'Щ', [218] = 'Ъ', [219] = 'Ы', [220] = 'Ь', [221] = 'Э', [222] = 'Ю', [223] = 'Я', [224] = 'а', [225] = 'б', [226] = 'в', [227] = 'г', [228] = 'д', [229] = 'е', [230] = 'ж', [231] = 'з', [232] = 'и', [233] = 'й', [234] = 'к', [235] = 'л', [236] = 'м', [237] = 'н', [238] = 'о', [239] = 'п', [240] = 'р', [241] = 'с', [242] = 'т', [243] = 'у', [244] = 'ф', [245] = 'х', [246] = 'ц', [247] = 'ч', [248] = 'ш', [249] = 'щ', [250] = 'ъ', [251] = 'ы', [252] = 'ь', [253] = 'э', [254] = 'ю', [255] = 'я', }
А вот эта штукенция для чего?:scratch:
 
1,417
1,029
А вот эта штукенция для чего?:scratch:
функция перевода русских букв в нижний регистр, взял из сниппетов, а это массив с русскими символами.
Как сделать перенос строки в выводе сообщения в чат? `n, \n пробовал, чёт нихера.
узнать максимальное количество букв, после которого обрезается текст и выводить опр. кол-во символов в каждом сообщении.
 

Петровичч

Новичок
8
4
Я редактировал файлы игры и добавил в игру новое оружие, не заменяя старых, уже присутствующих. Как изменить библиотеки так, чтобы в них вписать оружие, которое я добавил?
 

Bogach

Активный
558
27
узнать максимальное количество букв, после которого обрезается текст и выводить опр. кол-во символов в каждом сообщении.
Допустим я узнаю сколько символов в строке (в сообщении написанном игроком), вроде функция какая - то на string начиналась, в общем, как обрезать сообщение на 2 части после определенного кол-ва символов? К примеру после 20 символов в сообщение, сообщение надо разделить на 2 части, как это сделать?
 

#Northn

Police Helper «Reborn» — уже ШЕСТЬ лет!
Всефорумный модератор
2,635
2,485
Lua:
function main()
  if not isSampLoaded() and isSampAvailable() then return end
    while true do
        wait(0)

        local letSizeX, letSizeY, color = sampTextdrawGetLetterSizeAndColor(2060)
        if color == 0x4d69ff then
            sampAddChatMessage("test")
        end
    end
end

Что здесь не так? Может какая-то ошибка с моей стороны? ID текстдрава верный.
Цвет неверно записал может или что-то тому подобное?
 
1,417
1,029
Lua:
function main()
  if not isSampLoaded() and isSampAvailable() then return end
    while true do
        wait(0)

        local letSizeX, letSizeY, color = sampTextdrawGetLetterSizeAndColor(2060)
        if color == 0x4d69ff then
            sampAddChatMessage("test")
        end
    end
end

Что здесь не так? Может какая-то ошибка с моей стороны? ID текстдрава верный.
Цвет неверно записал может или что-то тому подобное?
проверку на существование текстдрава поставь
Lua:
sampTextdrawIsExists(2060)
и параметр color получи перед сравнением, мб неверный.
 

#Northn

Police Helper «Reborn» — уже ШЕСТЬ лет!
Всефорумный модератор
2,635
2,485
проверку на существование текстдрава поставь
Lua:
sampTextdrawIsExists(2060)
и параметр color получи перед сравнением, мб неверный.
проверку тоже ставил, не помогло
Lua:
function main()
  if not isSampLoaded() and isSampAvailable() then return end
    while true do
        wait(0)

        if sampTextdrawIsExists(2060) then
        local letSizeX, letSizeY, color = sampTextdrawGetLetterSizeAndColor(2060)
        if color == 0x4d69ff then
            sampSendChat("ауе")
        end
    end
end
end
 

#Northn

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

imring

Ride the Lightning
Всефорумный модератор
2,355
2,516
Как это именно "вывезти" цвет?
Lua:
sampSendChat(('%X'):format(color))


Вопрос:
Почему findFirstFile/findNextFile выдаёт . и ..?
Lua:
local h, n = findFirstFile('*')
while true do wait(0)
    if h then
        if n then
            local f = io.open(n)
            if not f then print('Directory: '..n)
            else print('File: '..n) end
            n = findNextFile(h)
        else findClose(h) end
    end
end
Код:
[16:45:58.815746] (script)    test: Directory: .
[16:45:58.850769] (script)    test: Directory: ..
[16:45:58.864778] (script)    test: Directory: anim
[16:45:58.901803] (script)    test: Directory: audio
[16:45:58.915812] (script)    test: Directory: backup
[16:45:58.951838] (script)    test: File: bass.dll
[16:45:58.967848] (script)    test: Directory: CLEO
 

AnWu

Guardian of Order
Всефорумный модератор
4,690
5,190
Уважаемые скриптеры. нужна ваша помощь.
Сделал себе небольшой скрипт анти-МГ, если он в моем сообщении находит слово которое есть в текстовом файле, то он это сообщение отправляет в /n (NonRP чат)
Все вроде бы было нормально, проблем не было, но сегодня он вдруг начал реагировать абсолютно на все, какое бы я слово не написал, все отправляет в /n. Не понимаю, что я не так сделал, может вы подскажете? Может подскажете реализацию получше?
Lua:
function sampev.onSendChat(message)
    if mgOn then
         local message2 = (tolower_rus(message))
         local fmg = io.open("moonloader\\AntiMG\\MG.txt","r")
         for line in fmg:lines() do
                   if string.find(message2,line) then
                    sampSendChat("/n " .. message)
                    return false
                 end
         end
         io.close(fmg)
    end
end
Заранее спасибо!
Возможно у тебя в файле есть регулярка какая-то. Используй:
Lua:
if string.find(message2, line, 1, true) then


Lua:
sampSendChat(('%X'):format(color))


Вопрос:
Почему findFirstFile/findNextFile выдаёт . и ..?
Lua:
local h, n = findFirstFile('*')
while true do wait(0)
    if h then
        if n then
            local f = io.open(n)
            if not f then print('Directory: '..n)
            else print('File: '..n) end
            n = findNextFile(h)
        else findClose(h) end
    end
end
Код:
[16:45:58.815746] (script)    test: Directory: .
[16:45:58.850769] (script)    test: Directory: ..
[16:45:58.864778] (script)    test: Directory: anim
[16:45:58.901803] (script)    test: Directory: audio
[16:45:58.915812] (script)    test: Directory: backup
[16:45:58.951838] (script)    test: File: bass.dll
[16:45:58.967848] (script)    test: Directory: CLEO
Это шаги деррикторий, .. -корень, . - дир выше уровнем.
 

#Northn

Police Helper «Reborn» — уже ШЕСТЬ лет!
Всефорумный модератор
2,635
2,485
Получил цвет FF4763FF, в каком это формате и как его использовать в игре, что-бы он юзабелен был?