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

user31883

Потрачен
101
219
Экранировать точку пробовал?
проблема, наверное, в самом inicfg. Ибо если вручную точку с экранированием поставить то получится краш при следующем сохранении
clipboard.png
либо я не понимаю как сделать правильно
 

Sub4ikGG

Новичок
14
9
Как получить текст onSetObjectMaterialText? Пример: на стене в интерьере написано HELLO.
Можно подробно?
 

moreveal

Известный
Проверенный
852
525
Мне надо через команду записать там ники чтобы потом обратно их получить скачав JSON или другой файл где он записан
Я бы для этих целей использовал базу данных, благо есть достаточное количество сайтов, готовых предоставить её бесплатно с некоторыми условиями. Но с точки зрения безопасности, вариант не очень, т.к. любой желающий сможет редактировать твою БД: достаточно будет декомпильнуть твой код и посмотреть данные для подключения.

Либо можно приобрести хостинг, на его стороне обрабатывать запросы и выполнять то или иное действие с БД, что исключает необходимость хранения данных для подключения непосредственно в коде твоего скрипта.
 
Последнее редактирование:
  • Нравится
Реакции: S-Sirius

Itachi Uchiha

Участник
124
21
Как сделать так, чтобы если нет ini файла то он создавался, и вместе с ним создавалась секция ?
Не открывается 2 окно при запуске скрипта(основное окно открывается по активации)
Lua:
local imgui = require 'imgui'
window1 = imgui.ImBool(false)
window2 = imgui.ImBool(false)
local x,y = getScreenResolution()


function imgui.OnDrawFrame()
        if  window1.v then
            imgui.SetNextWindowPos(imgui.ImVec2(x/3, y/2),  imgui.Cond.FirstUseEver) -- imgui.WindowFlags.NoMove
            imgui.Begin(u8'##wind1', imgui.WindowFlags.NoResize  + imgui.WindowFlags.NoCollapse + imgui.WindowFlags.AlwaysAutoResize + imgui.WindowFlags.NoTitleBar)
            imgui.Text('Test')
            imgui.End()
        end
        if  window2.v then
            imgui.SetNextWindowPos(imgui.ImVec2(x/2, y/2),  imgui.Cond.FirstUseEver) -- imgui.WindowFlags.NoMove
            imgui.Begin(u8'##wind2', imgui.WindowFlags.NoResize  + imgui.WindowFlags.NoCollapse + imgui.WindowFlags.AlwaysAutoResize + imgui.WindowFlags.NoTitleBar)
            imgui.Text('Test')
            imgui.End()
        end
end

function main()
    while true do
        imgui.Process =  window1.v or window2.v
        wait(0)
    end
end
Lua:
local imgui = require 'imgui'
window1 = imgui.ImBool(false)
window2 = imgui.ImBool(false)
local x,y = getScreenResolution()


function imgui.OnDrawFrame()
        if  window1.v then
            imgui.SetNextWindowPos(imgui.ImVec2(x/3, y/2),  imgui.Cond.FirstUseEver) -- imgui.WindowFlags.NoMove
            imgui.Begin(u8'##wind1', window1, imgui.WindowFlags.NoResize  + imgui.WindowFlags.NoCollapse + imgui.WindowFlags.AlwaysAutoResize + imgui.WindowFlags.NoTitleBar)
            imgui.Text('Test')
            imgui.End()
        end
        if  window2.v then
            imgui.SetNextWindowPos(imgui.ImVec2(x/2, y/2),  imgui.Cond.FirstUseEver) -- imgui.WindowFlags.NoMove
            imgui.Begin(u8'##wind2', window2, imgui.WindowFlags.NoResize  + imgui.WindowFlags.NoCollapse + imgui.WindowFlags.AlwaysAutoResize + imgui.WindowFlags.NoTitleBar)
            imgui.Text('Test')
            imgui.End()
        end
end

function main()
    while true do
        imgui.Process =  window1.v or window2.v
        wait(0)
    end
end
должно помочь.
Ну и активацию этих окон думаю сам сделаешь
 

user31883

Потрачен
101
219
Как сделать так, чтобы если нет ini файла то он создавался, и вместе с ним создавалась секция ?

Lua:
local imgui = require 'imgui'
window1 = imgui.ImBool(false)
window2 = imgui.ImBool(false)
local x,y = getScreenResolution()


function imgui.OnDrawFrame()
        if  window1.v then
            imgui.SetNextWindowPos(imgui.ImVec2(x/3, y/2),  imgui.Cond.FirstUseEver) -- imgui.WindowFlags.NoMove
            imgui.Begin(u8'##wind1', window1, imgui.WindowFlags.NoResize  + imgui.WindowFlags.NoCollapse + imgui.WindowFlags.AlwaysAutoResize + imgui.WindowFlags.NoTitleBar)
            imgui.Text('Test')
            imgui.End()
        end
        if  window2.v then
            imgui.SetNextWindowPos(imgui.ImVec2(x/2, y/2),  imgui.Cond.FirstUseEver) -- imgui.WindowFlags.NoMove
            imgui.Begin(u8'##wind2', window2, imgui.WindowFlags.NoResize  + imgui.WindowFlags.NoCollapse + imgui.WindowFlags.AlwaysAutoResize + imgui.WindowFlags.NoTitleBar)
            imgui.Text('Test')
            imgui.End()
        end
end

function main()
    while true do
        imgui.Process =  window1.v or window2.v
        wait(0)
    end
end
должно помочь.
Ну и активацию этих окон думаю сам сделаешь
doesFileExist
Пример
 

Itachi Uchiha

Участник
124
21
doesFileExist
Пример
скрипт крашит


Lua:
local directIni = 'moonloader\\config\\AM.ini' --
local mainIni = inicfg.load(nil, directIni)
if not doesFileExist('moonloader/config/AM.ini') then inicfg.save(nil, 'AM.ini') end
 

Fott

Простреленный
3,431
2,270
Мне надо через команду записать там ники чтобы потом обратно их получить скачав JSON или другой файл где он записан
Ты там панель управления ядерной бомбой что-ли делаешь. Ебани обычную пастебин привязку, можешь по серийнику если хочешь да и все. Если захотят крякнуть - крякнутв любом случае.
 
  • Нравится
Реакции: S-Sirius

Itachi Uchiha

Участник
124
21
скрипт крашит


Lua:
local directIni = 'moonloader\\config\\AM.ini' --
local mainIni = inicfg.load(nil, directIni)
if not doesFileExist('moonloader/config/AM.ini') then inicfg.save(nil, 'AM.ini') end
[19:19:42.560421] (system) Session started.
[19:19:42.561420] (debug) Module handle: 5D910000

MoonLoader v.025-beta loaded.
Developers: FYP, hnnssy, EvgeN 1137

Copyright (c) 2016, BlastHack Team
https://www.blast.hk/moonloader/

[19:19:42.561420] (info) Working directory: C:\Users\Даниил\Desktop\taburetka 200\moonloader
[19:19:42.561420] (debug) FP Control: 0009001F
[19:19:42.561420] (debug) Game: GTA SA 1.0.0.0 US
[19:19:42.561420] (system) Installing pre-game hooks...
[19:19:42.561420] (system) Hooks installed.
[19:19:44.035806] (debug) Initializing opcode handler table
[19:19:44.036807] (debug) package.path = C:\Users\Даниил\Desktop\taburetka 200\moonloader\lib\?.lua;C:\Users\Даниил\Desktop\taburetka 200\moonloader\lib\?\init.lua;C:\Users\Даниил\Desktop\taburetka 200\moonloader\?.lua;C:\Users\Даниил\Desktop\taburetka 200\moonloader\?\init.lua;.\?.lua;C:\Users\Даниил\Desktop\taburetka 200\moonloader\lib\?.luac;C:\Users\Даниил\Desktop\taburetka 200\moonloader\lib\?\init.luac;C:\Users\Даниил\Desktop\taburetka 200\moonloader\?.luac;C:\Users\Даниил\Desktop\taburetka 200\moonloader\?\init.luac;.\?.luac
[19:19:44.036807] (debug) package.cpath = C:\Users\Даниил\Desktop\taburetka 200\moonloader\lib\?.dll;
[19:19:44.036807] (system) Loading script 'C:\Users\Даниил\Desktop\taburetka 200\moonloader\AL.lua'...
[19:19:44.036807] (debug) New script: 04EB5514
[19:19:44.050797] (debug) Add thread 01C9AC1D to SCM-thread queue
[19:19:44.053795] (system) Demo Helper: Loaded successfully.
[19:19:44.053795] (system) Loading script 'C:\Users\Даниил\Desktop\taburetka 200\moonloader\AutoReboot.lua'...
[19:19:44.053795] (debug) New script: 04EB3744
[19:19:44.054795] (system) ML-AutoReboot: Loaded successfully.
[19:19:44.054795] (system) Loading script 'C:\Users\Даниил\Desktop\taburetka 200\moonloader\Hund Helper.lua'...
[19:19:44.054795] (debug) New script: 04EB47D4
[19:19:47.777486] (system) Unloading...
[19:19:47.777486] (system) Demo Helper: Script terminated. (04EB5514)
[19:19:47.778485] (system) ML-AutoReboot: Script terminated. (04EB3744)
[19:19:47.788481] (system) Session terminated.
[19:19:47.788481] (debug) Remove thread 01C9AC1D from SCM-thread queue
 

user31883

Потрачен
101
219
скрипт крашит


Lua:
local directIni = 'moonloader\\config\\AM.ini' --
local mainIni = inicfg.load(nil, directIni)
if not doesFileExist('moonloader/config/AM.ini') then inicfg.save(nil, 'AM.ini') end

Lua:
local DirectIni = 'AM.ini'
local mainIni = inicfg.load({
    config =
        {
        }       
}, DirectIni)
if not doesDirectoryExist("moonloader\\config") then
    createDirectory("moonloader\\config")
end
if not doesFileExist('moonloader/config/'..DirectIni) then inicfg.save(mainIni, DirectIni) end
наверное так с пустой секцией
 

G W

Участник
141
5
есть функция которая проверяет попал ли игрок в автомобиль или нет ?
 

корбус

Известный
434
108
помогите как узнать ник и ид игрока из чата например: Name_Surname[123] сказал: 123
 

Itachi Uchiha

Участник
124
21
Как вывести текущее время в imgui.Text
Как вывести кол-во времени до Pay Day(Начало каждого часа)
помогите как узнать ник и ид игрока из чата например: Name_Surname[123] сказал: 123
Lua:
if text:find('[a-zA-Z_]+%[(%d+)%] говорит:{B7AFAF} (.+)') then
        local playerNick, playerID, playerText = text:match('[a-zA-Z_]+%[(%d+)%] говорит:{B7AFAF} (.+)') -- получаем данные из регулярок
        --code
        sampAddChatMessage('Ид игрока: '..playerID..' Ник: '..playerNick..' Текст: '..playerText, -1)
end
 
  • Нравится
Реакции: корбус