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

Smeruxa

t.me/smeruxa
Проверенный
1,403
751
Не выводится в чат значение из конфига. Что делать?

code:
require "lib.moonloader"
local encoding = require "encoding"
local sampev = require 'lib.samp.events'
local imgui = require 'imgui'
local main_window_state = imgui.ImBool(false)
local text_buffer = imgui.ImBuffer(256)
local inicfg = require 'inicfg'
local directini = "moonloader\\config.ini"
local mainini = inicfg.load(nil, directini)
local stateini = inicfg.save(mainini, directini)
encoding.default = 'CP1251'
u8 = encoding.UTF8

function main()
    while not isSampAvailable() do wait(100) end
    while true do wait(0)
    end
    sampRegisterChatCommand("getinfo", getinfo)
    sampRegisterChatCommand("setinfo", setinfo)
    _, id = sampGetPlayerIdByCharHandle(PLAYER_PED)
    nick = sampGetPlayerNickname(id)
end
function getinfo(arg)
    sampAddChatMessage(mainini.config.name, -1)
end

function setinfo(arg)
    -- body
end
очень много мусора лишнего
Lua:
require "lib.moonloader"
local inicfg = require 'inicfg'

local HLcfg = inicfg.load({
    config = {
        name = ""  
    }
}, "test.ini")
inicfg.save(HLcfg, "test.ini")

function save()
    inicfg.save(HLcfg, "test.ini")
end

function main()
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand("getinfo", function()
        print(HLcfg.config.name)
    end)
    sampRegisterChatCommand("setinfo", function(arg)
        HLcfg.config.name = arg
        save()
        print("arg name have new value -> "..arg)
    end)
    wait(-1)
end
 
  • Нравится
Реакции: YarikVL

BaiYun

Участник
43
3
очень много мусора лишнего
Lua:
require "lib.moonloader"
local inicfg = require 'inicfg'

local HLcfg = inicfg.load({
    config = {
        name = "" 
    }
}, "test.ini")
inicfg.save(HLcfg, "test.ini")

function save()
    inicfg.save(HLcfg, "test.ini")
end

function main()
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand("getinfo", function()
        print(HLcfg.config.name)
    end)
    sampRegisterChatCommand("setinfo", function(arg)
        HLcfg.config.name = arg
        save()
        print("arg name have new value -> "..arg)
    end)
    wait(-1)
end
Я знаю, я луа изучаю сижу поэтому и мусора много

Перенести это надо:
Посмотреть вложение 193921
И у тебя в конфиге ключ config есть?
Если не ошибаюсь, при открытии твоего файла ini должно быть так:
[config]
name = "Значение твое"
ini файл такой и есть у меня
 

YarikVL

Известный
Проверенный
4,744
1,815
Я знаю, я луа изучаю сижу поэтому и мусора много
Советую:

ini файл такой и есть у меня
У тебя скорее всего вообще не регистрируются такие команды, потому что бесконечный цикл запускается и не дает выполняться коду дальше ( если я не ошибаюсь то оно так работает )
И у тебя в конфиге ключ config есть?
Ключ это не название файла, а так сказать таблица, к которой твой lua файл обращается. Ну в роликах по ссылке выше - автор рассказывает про эти ключи.
при открытии твоего файла ini должно быть так:
[config] name = "Значение твое"
 

BaiYun

Участник
43
3
Советую:



У тебя скорее всего вообще не регистрируются такие команды, потому что бесконечный цикл запускается и не дает выполняться коду дальше ( если я не ошибаюсь то оно так работает )

Ключ это не название файла, а так сказать таблица, к которой твой lua файл обращается. Ну в роликах по ссылке выше - автор рассказывает про эти ключи.
1) По этим видосам я и учусь
2)Кмд реагается и все норм
3)
Screenshot_174.png
 

Strand

Участник
48
27
Есть проблема со скриптом. Пытаюсь прочитать файл, но игру крашит, либо она намертво зависает. Как решить проблему? Первый файл вести 3КБ, второй 79КБ
Lua:
require 'lib.moonloader'
local sampev = require 'samp.events'

local snailMaticDir = os.getenv('USERPROFILE') .. '\\Documents\\GTA San Andreas User Files\\SAMP\\SnailMatic\\'
local settingsSnailMatic, currentProfileName, profileJson

function main()

    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    
    sampRegisterChatCommand('updateprofile', function()
        updateProfileInfo()
    end)
    
    sampRegisterChatCommand('checkprofile', function()
        if profileJson == nil then sampAddChatMessage('You need to load profile first!',-1) return end
        for _, folder in pairs(profileJson) do
            for _, bind in pairs(folder.binds) do
                print(bind.name)
            end
        end
    end)
    
    function updateProfileInfo()

        sampAddChatMessage('Started checking settings!',-1)
        settingsSnailMatic = io.open(snailMaticDir..'snailmatic.json', 'r')
        currentProfileName = string.match(io.read(), '"profile":"([%w%s%pА-Яа-яЁё]+)"')
        io.close(settingsSnailMatic)
        
        sampAddChatMessage('Opening profile file!',-1)
        profileJson = io.open(snailMaticDir..'profiles\\'..currentProfileName..'.json', 'r')
        local buffer = json.decode(io.read())
        io.close(profileJson)
        
        profileJson = table.copy(buffer)
        
        sampAddChatMessage('Profile info updated!',-1)

    end
    
end
 

joumey

Активный
194
44
Хай. Можете помочь сделать скрипт, который будет отправлять команды после того, когда в чате найдет текст "объявление". У работает, если я сам пишу "объявление" в чат. А если просто в чате, ничего не происходит. Вот код
Скинь строку с обьявлением из чатлога

Привет ребят. В чем беда?
Код скинь
 

Leon_Trotsky

Участник
39
2
Как сделать так, чтобы скрипт работал с 2 названиями?

Код:
if thisScript().filename ~= "AdminTools.lua" then
    thisScript():unload()
end
 
  • Bug
Реакции: MLycoris

chapo

чопа сребдс // TG/IG: @moujeek
Модератор
9,042
11,887
Как сделать так, чтобы скрипт работал с 2 названиями?

Код:
if thisScript().filename ~= "AdminTools.lua" then
    thisScript():unload()
end
 
  • Вау
Реакции: de_clain

sosnov

Известный
329
115
уауауа помогите,скрипт умирает из за библиотек,вот код их подключения:

Lua:
require = ('lib.moonloader')
local imgui = require ('mimgui')
local encoding = require ('encoding')
encoding.default = 'CP1251'
local u8 = encoding.UTF8

вот ошибка:

[ML] (error) fskin.lua: F:\Clear GTA SAMP low PC\moonloader\fskin.lua:2: attempt to call global 'require' (a string value)
stack traceback:
F:\Clear GTA SAMP low PC\moonloader\fskin.lua:2: in main chunk

в чем проблема?
 

whyega52

Eblang головного мозга
Модератор
2,825
2,729
уауауа помогите,скрипт умирает из за библиотек,вот код их подключения:

Lua:
require = ('lib.moonloader')
local imgui = require ('mimgui')
local encoding = require ('encoding')
encoding.default = 'CP1251'
local u8 = encoding.UTF8

вот ошибка:

[ML] (error) fskin.lua: F:\Clear GTA SAMP low PC\moonloader\fskin.lua:2: attempt to call global 'require' (a string value)
stack traceback:
F:\Clear GTA SAMP low PC\moonloader\fskin.lua:2: in main chunk

в чем проблема?
В первой строке ты переопределяешь дефолт функцию "require" на либу от мунлоадера и делаешь ее переменной, из-за этого далее скрипт не воспринимает эту функцию как функцию 😐
Исправь первую строку на require('lib.moonloader')
 
  • Нравится
Реакции: sosnov

sosnov

Известный
329
115
В первой строке ты переопределяешь дефолт функцию "require" на либу от мунлоадера и делаешь ее переменной, из-за этого далее скрипт не воспринимает эту функцию как функцию 😐
Исправь первую строку на require('lib.moonloader')
смотри,исправил,но теперь другая ошибка,исправить не могу,вот:

[ML] (error) fskin.lua: F:\Clear GTA SAMP low PC\moonloader\fskin.lua:320: attempt to index global 'renderWindow' (a nil value)
stack traceback:
F:\Clear GTA SAMP low PC\moonloader\fskin.lua: in function 'Condition'
F:\Clear GTA SAMP low PC\moonloader\lib\mimgui\init.lua:208: in function <F:\Clear GTA SAMP low PC\moonloader\lib\mimgui\init.lua:201>
[ML] (error) fskin.lua: Script died due to an error. (0CFCF26C)
 

Gorskin

🖕
Проверенный
1,351
1,200
Как выполнить действие после окончания цикла for?
У цикла for имеется счётчик i. Просто сделай проверку на количество циклов, например у тебя for i = 1, 10 do --[[тут какой-то код]] end.
Просто пишем if i == 10 then и дальше делаем что хотим.
 

siwage

Активный
193
67
смотри,исправил,но теперь другая ошибка,исправить не могу,вот:

[ML] (error) fskin.lua: F:\Clear GTA SAMP low PC\moonloader\fskin.lua:320: attempt to index global 'renderWindow' (a nil value)
stack traceback:
F:\Clear GTA SAMP low PC\moonloader\fskin.lua: in function 'Condition'
F:\Clear GTA SAMP low PC\moonloader\lib\mimgui\init.lua:208: in function <F:\Clear GTA SAMP low PC\moonloader\lib\mimgui\init.lua:201>
[ML] (error) fskin.lua: Script died due to an error. (0CFCF26C)
320 строку покажи
и как ты обьявлял окно