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

koolkup

Новичок
7
0
А можно на луа вообще как-то сделать чтобы скрипт открывал чат и вводил туда текст но не отправлял?
 

Anton Nixon

Активный
474
48
Что не так?
Lua:
fludinad = text:match('VIP Объявление | (.+) Контакт: (%w+_?%w+)%[%d+]%, тел: (%d+)')
if fludinad and antifludad.v then -- шоб без лишних вопрос я активирую antifludad.v так шо норм всё
    return false
end
Мб так надо?
Lua:
fludinad = text:match('VIP Объявление | (.+) Контакт: (%w+_?%w+)%[(%d+)%]%, тел: (%d+)')
 

EndoHokage

Активный
136
55
Мне нужно что бы какое это действие выполнялось после завершение потока, как то можно сделать ожидание?
Заранее спасибо
 

qwebkeck

Новичок
3
0
Всем привет, такой вопрос, как впихнуть сюда автокопирование по БД? (Чтобы после sampAddChatMessage скопировало ответ)
Lua:
local sampev = require('lib.samp.events')
local database = {
{questions="Один", answer="1"},
{questions="Два", answer="2"},
{questions="Три", answer="3"},
{questions="Четыре", answer="4"},
{questions="Пять", answer="5"}
}

function main()
repeat wait(0) until isSampAvailable()
        wait(1)
        sampRegisterChatCommand('test', cmd_test)
        wait(4444)
        sampAddChatMessage('Скрипт загружен', 125478)
end

function sampev.onServerMessage(color, text)
    for key, val in pairs(database) do
        if active and string.find(text, database[key]["questions"]) then
            lua_thread.create(function()
                wait(123)
                sampAddChatMessage("Ответ: " ..database[key]["answer"], 125478)
            end)
        end
    end
end
 

Anton Nixon

Активный
474
48
Почему ошибка и как фиксить?
Lua:
[ML] (error) autogive.lua: D:\Games\GTA SAMP\moonloader\autogive.lua:50: attempt to index local 'font_flag' (a nil value)
stack traceback:
    D:\Games\GTA SAMP\moonloader\autogive.lua:50: in main chunk
вот тут ошибка:
Lua:
local font_flag = require('moonloader').font_flag
local font = renderCreateFont('Verdana', 100, font_flag.BOLD)
 

S-Sirius

Известный
353
21
В чём проблема?
Lua:
function autoupdate(json_url, prefix, url)
  local dlstatus = require('moonloader').download_status
  local json = getWorkingDirectory() .. '\\'..thisScript().name..'-Updater.json'
  if doesFileExist(json) then os.remove(json) end
  downloadUrlToFile(json_url, json,
    function(id, status, p1, p2)
      if status == dlstatus.STATUSEX_ENDDOWNLOAD then
        if doesFileExist(json) then
          local f = io.open(json, 'r')
          if f then
            local info = decodeJson(f:read('*a'))
            updatelink = info.updateurl -- 721
            updateversion = info.latest
            f:close()
            os.remove(json)
            if updateversion ~= thisScript().version then
              lua_thread.create(function(prefix)
                local dlstatus = require('moonloader').download_status
                local color = -1
                sampAddChatMessage(('{20997c}** [TEST]: {ffffff}Обнаружено обновление. Пытаюсь обновиться c '..thisScript().version..' на '..updateversion)..' {20997c}**', color)
                wait(250)
                downloadUrlToFile(updatelink, thisScript().path,
                  function(id3, status1, p13, p23)
                    if status1 == dlstatus.STATUS_DOWNLOADINGDATA then
                      print(string.format('Загружено %d из %d.', p13, p23))
                    elseif status1 == dlstatus.STATUS_ENDDOWNLOADDATA then
                      print('Загрузка обновления завершена.')
                      sampAddChatMessage(('{20997c}[TEST]: {ffffff}Обновление завершено!'), color)
                      goupdatestatus = true
                      lua_thread.create(function() wait(500) thisScript():reload() end)
                    end
                    if status1 == dlstatus.STATUSEX_ENDDOWNLOAD then
                      if goupdatestatus == nil then
                        sampAddChatMessage(('{20997c}** [TEST]: {ffffff}Обновление прошло неудачно. Запускаю устаревшую версию.. {20997c}**'), color)
                        update = false
                      end
                    end
                  end
                )
                end, prefix
              )
            else
              update = false
              print('v'..thisScript().version..': Обновление не требуется.')
            end
          end
        else
          print('v'..thisScript().version..': Не могу проверить обновление. Смиритесь или проверьте самостоятельно на '..url)
          update = false
        end
      end
    end
  )
  while update ~= false do wait(100) end
end

JSON:
{
  "updateurl": "https://www.dl.dropboxusercontent.com/s/....",
  "latest": "[TEST] 0.6"
}

[ML] (exception) SA:MP Indicators: CJSON: Expected value but found invalid token at character 1
[ML] (error) SA:MP Indicators: D:\Other\GTA San Andreas\moonloader\Script by Apollon.lua:721: attempt to index local 'info' (a nil value)
stack traceback:
D:\Other\GTA San Andreas\moonloader\Script by Apollon.lua:721: in function <D:\Other\GTA San Andreas\moonloader\Script by Apollon.lua:715>
[ML] (error) SA:MP Indicators: Script died due to an error. (1226D494)
 

Firus20016

Участник
148
15
вылетает с этой хуйней)
1582399044903.png
мб кто знает как фиксануть?)
 

Varik_Soft

Участник
72
3
Что делать если скрипт не может найти текст ?

Вот мой код:
Lua:
function sampev.onShowDialog(id, style, title, button1, button2, text)
    if id == 235 and text:find("Текст") then
        printStringNow("Hello", 1000)
    end
end
 

koolkup

Новичок
7
0
Lua:
local k = require 'vkeys'
local se = require 'lib.samp.events'
local mem = require 'memory'

function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    while not isSampAvailable() do wait(0) end
    if isSampAvailable() then mem.setuint8(sampGetBase() + 0x67450, 0xC3, true) end
        while true do
        wait(0)
    end
lua_thread.create(binds)
end

function binds()
    while sampIsChatInputActive() or sampIsDialogActive() do wait(0) end
    while true do wait(0)
        if isKeyJustPressed(k.VK_I) then
            sampSetChatInputEnabled(true)
            wait(100)
            sampSetChatInputText('/me ')
        elseif isKeyJustPressed(k.VK_O) then
            sampSetChatInputEnabled(true)
            wait(100)
            sampSetChatInputText('/do ')
        elseif isKeyJustPressed(k.VK_P) then
            sampSetChatInputEnabled(true)
            wait(100)
            sampSetChatInputText('/todo ')
        elseif isKeyJustPressed(k.VK_U) then
            sampSetChatInputEnabled(true)
            wait(100)
            sampSetChatInputText('/try ')
        elseif isKeyJustPressed(k.VK_0) then
            sampSetChatInputEnabled(true)
            wait(100)
            sampSetChatInputText('/fb ')
        elseif isKeyJustPressed(k.VK_9) then
            sampSetChatInputEnabled(true)
            wait(100)
            sampSetChatInputText('/f ')
        elseif isKeyJustPressed(k.VK_J) then
            sampSetChatInputEnabled(true)
            wait(100)
            sampSetChatInputText('/b ')
        elseif isKeyJustPressed(k.VK_F1) then
            sampSendChat('/mm')
        elseif isKeyJustPressed(k.VK_X) then
            sampSendChat('/gun')
        elseif isKeyJustPressed(k.VK_SUBTRACT) then
            sampSendChat('/lock')
        elseif isKeyJustPressed(k.VK_MULTIPLY) then
            sampSendChat('/key')
        end
        if isKeyDown(k.VK_MENU) and isKeyJustPressed(k.VK_SUBTRACT) then
            sampSendChat('/fillcar')
        end
        if isKeyDown(k.VK_MENU) and isKeyJustPressed(k.VK_MULTIPLY) then
            sampSendChat('/repcar')
        end
    end
end
Я вернулся, в чём проблема?
Ошибок нет, просто ничего не работает
 

Dmitriy Makarov

25.05.2021
Проверенный
2,478
1,113
Что делать если скрипт не может найти текст ?

Вот мой код:
Lua:
function sampev.onShowDialog(id, style, title, button1, button2, text)
    if id == 235 and text:find("Текст") then
        printStringNow("Hello", 1000)
    end
end
Проверить кодировку скрипта, которая должна быть Windows-1251
 
  • Нравится
Реакции: Varik_Soft