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

Vritz

Новичок
13
0
ПОМОГИТЕ!

Привет ребят!
Нужна помощь!

-Как узнать координаты чекпоинта? (Такого как на фото)

-За любую помощь буду признателе
 

Вложения

  • EAEB6EB1-9122-4E3B-8B38-282B74F55656.jpeg
    EAEB6EB1-9122-4E3B-8B38-282B74F55656.jpeg
    9.7 KB · Просмотры: 82
  • 5EA96675-07DE-4EA4-9CAD-580E7E857721.jpeg
    5EA96675-07DE-4EA4-9CAD-580E7E857721.jpeg
    100.6 KB · Просмотры: 92

THERION

Известный
Проверенный
88
327
ПОМОГИТЕ!

Привет ребят!
Нужна помощь!

-Как узнать координаты чекпоинта? (Такого как на фото)

-За любую помощь буду признателе
По логике вещей такой кружок должен быть 1, если это так - этот код должен сработать, если я правильно нашел id этого обьекта, если не сработает поищи этот кружок тут и поменяй object_id https://dev.prineside.com/ru/gtasa_samp_model_id/search/?q=marker&page=1
Lua:
function get_circle_marker_cords()
  local object_id = 1316 -- возможно 2992

  for _, hndl in pairs(getAllObjects()) do
    if getObjectModel(hndl) == object_id then
      local _, x, y, z = getObjectCoordinates(hndl)
      return x, y, z
    end
  end
  return
end
 
  • Нравится
Реакции: Vritz

Vespan

Чешский луашер
Проверенный
2,118
1,715
help please
Lua:
           if imgui.Button('test') then
            imgui.OpenPopup('test')
            for line in io.lines('moonloader/Gold Tools/Чекер.txt') do
                   CheckerAdd_.v = line
               end
        end
        -------------------
        imgui.InputTextMultiline(u8' - Игроки', CheckerAdd_, imgui.ImVec2(150, 150))
В InputTextMultiline из .txt файла,пишет только последнюю строку..

.txt
Код:
-- LSPD Peep_Niki
-- SWAT Senay_Mix
-- RCSD Max_Kolachev
-- FBI Kanneth_Washington
-- LSFD
-- ArmyLS Alecsander_Chopovik
-- Пра-во Tim_Rojers
-- Мэрия
-- San News Jesus_Avg
-- Vespan_WilsonLife
-- чекер работает*
 

THERION

Известный
Проверенный
88
327
help please
Lua:
           if imgui.Button('test') then
            imgui.OpenPopup('test')
            for line in io.lines('moonloader/Gold Tools/Чекер.txt') do
                   CheckerAdd_.v = line
               end
        end
        -------------------
        imgui.InputTextMultiline(u8' - Игроки', CheckerAdd_, imgui.ImVec2(150, 150))
В InputTextMultiline из .txt файла,пишет только последнюю строку..

.txt
Код:
-- LSPD Peep_Niki
-- SWAT Senay_Mix
-- RCSD Max_Kolachev
-- FBI Kanneth_Washington
-- LSFD
-- ArmyLS Alecsander_Chopovik
-- Пра-во Tim_Rojers
-- Мэрия
-- San News Jesus_Avg
-- Vespan_WilsonLife
-- чекер работает*
4 строка поменяй
Lua:
CheckerAdd_.v = CheckerAdd_.v + line + '\n' -- '\n' если нужен отступ
 
  • Нравится
Реакции: Vespan

Vespan

Чешский луашер
Проверенный
2,118
1,715
Lua:
               for line in io.lines('moonloader/Gold Tools/Чекер.txt') do
                   CheckerAdd_.v = CheckerAdd_.v + line + '\n' --
               end
            
            -- crash
            [00:27:39.676330] (system)    imgui_notf [NEW].lua: Loaded successfully.
[00:27:42.377868] (error)    Gold Tools : D:\GTA\GTASHKA\moonloader\Gold Tools.lua:3407: attempt to perform arithmetic on field 'v' (a string value)
stack traceback:
    D:\GTA\GTASHKA\moonloader\Gold Tools.lua:3407: in function 'TextImgui'
    D:\GTA\GTASHKA\moonloader\Gold Tools.lua:3756: in function 'OnDrawFrame'
    D:\GTA\GTASHKA\moonloader\lib\imgui.lua:1378: in function <D:\GTA\GTASHKA\moonloader\lib\imgui.lua:1367>
[00:27:42.383861] (error)    Gold Tools : Script died due to an error. (126A5914)
[00:27:42.436861] (error)    imgui_notf [NEW].lua: cannot resume non-suspended coroutine
stack traceback:
    [C]: in function 'SetMouseCursor'
    D:\GTA\GTASHKA\moonloader\imgui_notf [NEW].lua:103: in function <D:\GTA\GTASHKA\moonloader\imgui_notf [NEW].lua:99>
[00:27:42.436861] (error)    imgui_notf [NEW].lua: Script died due to an error. (126A66DC)
4 строка поменяй
Lua:
CheckerAdd_.v = CheckerAdd_.v + line + '\n' -- '\n' если нужен отступ
 

THERION

Известный
Проверенный
88
327
Lua:
               for line in io.lines('moonloader/Gold Tools/Чекер.txt') do
                   CheckerAdd_.v = CheckerAdd_.v + line + '\n' --
               end
           
            -- crash
            [00:27:39.676330] (system)    imgui_notf [NEW].lua: Loaded successfully.
[00:27:42.377868] (error)    Gold Tools : D:\GTA\GTASHKA\moonloader\Gold Tools.lua:3407: attempt to perform arithmetic on field 'v' (a string value)
stack traceback:
    D:\GTA\GTASHKA\moonloader\Gold Tools.lua:3407: in function 'TextImgui'
    D:\GTA\GTASHKA\moonloader\Gold Tools.lua:3756: in function 'OnDrawFrame'
    D:\GTA\GTASHKA\moonloader\lib\imgui.lua:1378: in function <D:\GTA\GTASHKA\moonloader\lib\imgui.lua:1367>
[00:27:42.383861] (error)    Gold Tools : Script died due to an error. (126A5914)
[00:27:42.436861] (error)    imgui_notf [NEW].lua: cannot resume non-suspended coroutine
stack traceback:
    [C]: in function 'SetMouseCursor'
    D:\GTA\GTASHKA\moonloader\imgui_notf [NEW].lua:103: in function <D:\GTA\GTASHKA\moonloader\imgui_notf [NEW].lua:99>
[00:27:42.436861] (error)    imgui_notf [NEW].lua: Script died due to an error. (126A66DC)
ой извиняюсь, забыл что пишу на луа
Lua:
CheckerAdd_.v = CheckerAdd_.v .. line .. '\n'
 
  • Влюблен
Реакции: Vespan

Vespan

Чешский луашер
Проверенный
2,118
1,715
И еще,вот у меня есть команды для чекера,добавить,список, и удалить ник.
Помогите с командой /ch_delete,я пробывал через gsub заменить ник на '',крашит.
Lua:
        sampRegisterChatCommand('ch_add', function(param)
            id = tonumber(param)
            if id == nil then PushMessage('[ CHECKER ] /ch_add [id игрока]') return end
            if not sampIsPlayerConnected(id) then PushMessage('[ CHECKER ] '..id..' нет в сети!') else
                file = io.open('moonloader/Gold Tools/Чекер.txt', 'a+')
                file:write(sampGetPlayerNickname(id)..' \n')
                file:close()
                PushMessage(string.format('[ CHECKER ] %s[%d] Был добавлен!', sampGetPlayerNickname(id), id))
            end
        end)
       
        sampRegisterChatCommand('ch_delete', function(param)--
               --
        end)

        sampRegisterChatCommand('ch_list', function(id)
            sampAddChatMessage('[ CHECKER ] Список:')
            lua_thread.create(function()
            BinderFile = io.open('moonloader/Gold Tools/Чекер.txt', 'r')
                for line in BinderFile:lines() do
                   sampAddChatMessage(line, -1)
                end
            end)          
        end)
 

СоМиК

Известный
458
314
Здравствуйте, хочу сделать проверку в скрипте на диалоговое окно, примерно так:
Условие с проверкой на диалоговое окно:
if sampIsDialogActive() then
    *действие*
end

Но мне бы хотелось сделать так, чтобы скрипт срабатывал не на любое диалоговое окно, а только на то, которое было указано в условии. То есть допустим чтобы скрипт работал только на диалоговое с текстом "привет", а на другие диалог. окна, скрипт вовсе не обращал внимание, можно ли так сделать? Если нет, то есть какие-либо самые нормальные обходы по этой теме?
 

Dmitriy Makarov

25.05.2021
Проверенный
2,500
1,131
Здравствуйте, хочу сделать проверку в скрипте на диалоговое окно, примерно так:
Условие с проверкой на диалоговое окно:
if sampIsDialogActive() then
    *действие*
end

Но мне бы хотелось сделать так, чтобы скрипт срабатывал не на любое диалоговое окно, а только на то, которое было указано в условии. То есть допустим чтобы скрипт работал только на диалоговое с текстом "привет", а на другие диалог. окна, скрипт вовсе не обращал внимание, можно ли так сделать? Если нет, то есть какие-либо самые нормальные обходы по этой теме?
Lua:
local sampev = require 'lib.samp.events' -- В начало скрипта


function sampev.onShowDialog(id, style, title, button1, button0, text)
    if id == 1 then -- Если ID диалога равен 1, тогда
        -- code
    end
end

-- Получить ID диалога можно так:
function sampev.onShowDialog(id, style, title, button1, button0, text)
    sampAddChatMessage(id, -1)
end
-- Также и с другими, только по другому
--[[
if title:find("Меню") then -- Если заголовок диалога "Меню", тогда
if text:find("привет") then -- Если в диалоге есть текст "привет", тогда
]]
 
  • Нравится
Реакции: СоМиК

reseller

Потрачен
33
8
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
И еще,вот у меня есть команды для чекера,добавить,список, и удалить ник.
Помогите с командой /ch_delete,я пробывал через gsub заменить ник на '',крашит.
Lua:
        sampRegisterChatCommand('ch_add', function(param)
            id = tonumber(param)
            if id == nil then PushMessage('[ CHECKER ] /ch_add [id игрока]') return end
            if not sampIsPlayerConnected(id) then PushMessage('[ CHECKER ] '..id..' нет в сети!') else
                file = io.open('moonloader/Gold Tools/Чекер.txt', 'a+')
                file:write(sampGetPlayerNickname(id)..' \n')
                file:close()
                PushMessage(string.format('[ CHECKER ] %s[%d] Был добавлен!', sampGetPlayerNickname(id), id))
            end
        end)
      
        sampRegisterChatCommand('ch_delete', function(param)--
               --
        end)

        sampRegisterChatCommand('ch_list', function(id)
            sampAddChatMessage('[ CHECKER ] Список:')
            lua_thread.create(function()
            BinderFile = io.open('moonloader/Gold Tools/Чекер.txt', 'r')
                for line in BinderFile:lines() do
                   sampAddChatMessage(line, -1)
                end
            end)         
        end)
Lua:
        sampRegisterChatCommand('ch_delete', function()
            local params = {...}, file

            for line in io.lines(params[1]) do
                  file = io.open(line, "w")
                  file:close()
            end
            os.remove(params[1])
        end)
ПОМОГИТЕ!

Привет ребят!
Нужна помощь!

-Как узнать координаты чекпоинта? (Такого как на фото)

-За любую помощь буду признателе
float X, float Y, float Z = getPickupCoordinates(Pickup pickup)
 
  • Нравится
Реакции: Vritz

Vritz

Новичок
13
0
Ребят, кто знает как можно сказать нарисовать такой текст как на фото.
-Фото взял з видоса DarkP1xel, только он там на c# писал, И там dll.

-За любую помощь буду признателен)
 

Вложения

  • 345642BE-9A7C-4956-B5B8-E21B1191A980.jpeg
    345642BE-9A7C-4956-B5B8-E21B1191A980.jpeg
    25.7 KB · Просмотры: 116

CaJlaT

07.11.2024 14:55
Модератор
2,830
2,660
Ребят, кто знает как можно сказать нарисовать такой текст как на фото.
-Фото взял з видоса DarkP1xel, только он там на c# писал, И там dll.

-За любую помощь буду признателен)
 
  • Нравится
Реакции: Vritz

Vespan

Чешский луашер
Проверенный
2,118
1,715
Lua:
        sampRegisterChatCommand('ch_delete', function()
            local params = {...}, file

            for line in io.lines(params[1]) do
                  file = io.open(line, "w")
                  file:close()
            end
            os.remove(params[1])
        end)

float X, float Y, float Z = getPickupCoordinates(Pickup pickup)
Lua:
        sampRegisterChatCommand('ch_delete', function()
            file = io.open('moonloader/Gold Tools/Чекер.txt', 'a+')
            local params = {...}, file

            for line in io.lines(params[1]) do
                  file = io.open(line, "w")
                  file:close()
            end
            os.remove(params[1])
        end)
        ------
        [10:40:30.744358] (error)    Gold Tools : D:\GTA\GTASHKA\moonloader\Gold Tools.lua:2019: bad argument #1 to 'gsub' (string expected, got nil)
stack traceback:
    [C]: in function 'gsub'
    D:\GTA\GTASHKA\moonloader\Gold Tools.lua:2019: in function <D:\GTA\GTASHKA\moonloader\Gold Tools.lua:2016>
[10:40:30.749242] (error)    Gold Tools : Script died due to an error. (0A9B185C)
[10:40:30.800017] (error)    imgui_notf [NEW].lua: cannot resume non-suspended coroutine
stack traceback:
    [C]: in function 'SetMouseCursor'
    D:\GTA\GTASHKA\moonloader\imgui_notf [NEW].lua:103: in function <D:\GTA\GTASHKA\moonloader\imgui_notf [NEW].lua:99>
[10:40:30.800017] (error)    imgui_notf [NEW].lua: Script died due to an error. (0A9BE724)
[10:40:58.202601] (script)    ML-AutoReboot: Loading "D:\GTA\GTASHKA\moonloader\Gold Tools.lua"...
[10:40:58.202601] (system)    Loading script 'D:\GTA\GTASHKA\moonloader\Gold Tools.lua'...
[10:40:58.202601] (debug)    New script: 0A9C6FEC
[10:40:58.206508] (error)    Gold Tools.lua: D:\GTA\GTASHKA\moonloader\Gold Tools.lua:2018: cannot use '...' outside a vararg function near '...'
[10:40:58.207495] (error)    Gold Tools.lua: Script died due to an error. (0A9C6FEC)
 

_mudota_

Потрачен
208
27
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Lua:
        sampRegisterChatCommand('ch_delete', function()
            file = io.open('moonloader/Gold Tools/Чекер.txt', 'a+')
            local params = {...}, file

            for line in io.lines(params[1]) do
                  file = io.open(line, "w")
                  file:close()
            end
            os.remove(params[1])
        end)
        ------
        [10:40:30.744358] (error)    Gold Tools : D:\GTA\GTASHKA\moonloader\Gold Tools.lua:2019: bad argument #1 to 'gsub' (string expected, got nil)
stack traceback:
    [C]: in function 'gsub'
    D:\GTA\GTASHKA\moonloader\Gold Tools.lua:2019: in function <D:\GTA\GTASHKA\moonloader\Gold Tools.lua:2016>
[10:40:30.749242] (error)    Gold Tools : Script died due to an error. (0A9B185C)
[10:40:30.800017] (error)    imgui_notf [NEW].lua: cannot resume non-suspended coroutine
stack traceback:
    [C]: in function 'SetMouseCursor'
    D:\GTA\GTASHKA\moonloader\imgui_notf [NEW].lua:103: in function <D:\GTA\GTASHKA\moonloader\imgui_notf [NEW].lua:99>
[10:40:30.800017] (error)    imgui_notf [NEW].lua: Script died due to an error. (0A9BE724)
[10:40:58.202601] (script)    ML-AutoReboot: Loading "D:\GTA\GTASHKA\moonloader\Gold Tools.lua"...
[10:40:58.202601] (system)    Loading script 'D:\GTA\GTASHKA\moonloader\Gold Tools.lua'...
[10:40:58.202601] (debug)    New script: 0A9C6FEC
[10:40:58.206508] (error)    Gold Tools.lua: D:\GTA\GTASHKA\moonloader\Gold Tools.lua:2018: cannot use '...' outside a vararg function near '...'
[10:40:58.207495] (error)    Gold Tools.lua: Script died due to an error. (0A9C6FEC)
[10:40:58.206508] (error) Gold Tools.lua: D:\GTA\GTASHKA\moonloader\Gold Tools.lua:2018: cannot use '...' outside a vararg function near '...'
 

rayprod

Участник
96
1
Ребята, кто может помочь. Я хочу что-бы счётчик прибавлял когда в чат идёт сообщение "Администратор Nick(он берётся с ini файла для"
Проблема в том что, когда в чат оправляется данное сообщение, после ника идёт ID его. И из-за этого счётчик не работает.
Вот код:
Lua:
function samp.onServerMessage(color, text)
    if text:match('Администратор ' ..mainIni.config.nick.. '[(%d+)] для') then
        ans = ans + 2
        mainIni.config.ans = mainIni.config.ans + 2
        mainIni.config.alls = mainIni.config.alls + 2
        inicfg.save(mainIni, 'stats.ini')
    end
end

Вот строчка из чата, только ид меняется, и всё время писать в ini файле, такое себе.
1593245611104.png