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

shakur.02

Известный
12
1
Да, для локального персонажа - playerPed
Например
Lua:
setCharCoordinates(pleyerPed, 0.0, 0.0, 0.0)
А с транспортом оно как? Если я хочу, к примеру, что бы определенная машина была обозначена пикапом? Как мне узнать ее хэндл? Я думал, типо по айди, но для функции определения айди транспорта в аргумент нужен хэндл. Я только начинаю разбираться в програмировании, так что не гноби :happy:
 

ufdhbi

Известный
Проверенный
1,460
866
А с транспортом оно как? Если я хочу, к примеру, что бы определенная машина была обозначена пикапом? Как мне узнать ее хэндл? Я думал, типо по айди, но для функции определения айди транспорта в аргумент нужен хэндл. Я только начинаю разбираться в програмировании, так что не гноби :happy:
Перебрать все магины циклом for, проверить что нужная в зоне стрима, проверить модель, если все верно то ставишь метку, проще будет если кто-то сидит в ней

Воспользуйся поиском по форуму, тут уже был данный пример
 
Последнее редактирование:

FYP

Известный
Автор темы
Администратор
1,764
5,923
Lua скрипты не работают когда игра свёрнута, сколько можно повторять.
со сторонним антиафком работают
Коооостыли. Если задумано что оно не должно работать в свёрнутом режиме, зачем это делать. Думаю если б фип хотел, фип бы сделал.
так задумано игрой. антиафк - не костыль, он разблокирует работу игры (а не только скриптов) в свёрнутом режиме. реализовать работу только скриптов при свёрнутой игре возможно, но это как раз было бы костылём, ведь смысл такой работы крайне ограничен, т.к. сама игра неактивна.
 

AnWu

Известный
Всефорумный модератор
4,777
5,400
со сторонним антиафком работают

так задумано игрой. антиафк - не костыль, он разблокирует работу игры (а не только скриптов) в свёрнутом режиме. реализовать работу только скриптов при свёрнутой игре возможно, но это как раз было бы костылём, ведь смысл такой работы крайне ограничен, т.к. сама игра неактивна.
ой да мне ровно как то. Вот написать такой на луа.
 

realgangster

Участник
37
0
со сторонним антиафком работают

так задумано игрой. антиафк - не костыль, он разблокирует работу игры (а не только скриптов) в свёрнутом режиме. реализовать работу только скриптов при свёрнутой игре возможно, но это как раз было бы костылём, ведь смысл такой работы крайне ограничен, т.к. сама игра неактивна.

Не подскажешь как замутить setVirtualKeyDown чтобы при AntiPause работало? и только в процессе gta_sa.exe (т.к если в оконном режиме переключиться на другое окно setVirtualKeyDown начинает работать в нём)
 

FYP

Известный
Автор темы
Администратор
1,764
5,923
Не подскажешь как замутить setVirtualKeyDown чтобы при AntiPause работало? и только в процессе gta_sa.exe (т.к если в оконном режиме переключиться на другое окно setVirtualKeyDown начинает работать в нём)
посредством этой функции это невозможно. функция эмулирует нажатия клавиш, а не посылает окну сообщения о нажатии клавиш.
ой да мне ровно как то. Вот написать такой на луа.
я сделал замечание за дезинформацию и поправил тебя, объяснив, что к чему, а ты говоришь, что тебе это безразлично.
грубо.
 
  • Нравится
Реакции: shakur.02

realgangster

Участник
37
0
посредством этой функции это невозможно. функция эмулирует нажатия клавиш, а не посылает окну сообщения о нажатии клавиш.

я сделал замечание за дезинформацию и поправил тебя, объяснив, что к чему, а ты говоришь, что тебе это безразлично.
грубо.
А не подскажешь тогда... возможно ли ответить на isKeyDown(VK_END) при AntiPause в нескольких окнах. Если возможно не подскажешь как?
 

Bogach

Активный
558
27
Ребят, я себе уже все голову сломал. Подскажите, почему не работает вот это:
Код:
function main()
while not isSampLoaded() do wait(100) end
while not isSampfuncsLoaded() do wait(1000) end
    repeat
     wait(0)
    until sampIsLocalPlayerSpawned()
    sampRegisterChatCommand("ass", ASMainMenu)
    sampRegisterChatCommand("perem", peremennaya)
 -- Ну и дальше там код тоже есть --
При заходе на сервер выдает такую ошибку
Код:
[ML] (error) opcode '0B61' call caused an unhandled exception
[ML] (error) [DRP]AutoSchool: cannot resume non-suspended coroutine
[ML] (error) [DRP]AutoSchool: Script died due to error. (05B069FC)

и ещё

почему при таком условии, у меня ини файл не сохраняется в указанную мной папку?(Папка существует)
Lua:
if not doesFileExist("moonloader\\config\\Autoschool\\Autoschool.ini") then inicfg.save(Data, "moonloader\\config\\Autoschool\\Autoschool.ini") end
Сохраняется только так
Lua:
inicfg.save(Data, "Autoschool.ini") end
в папку config
 
Последнее редактирование:

uczoja62

Новичок
74
4
Как получить массив киллстата?
Как загрузить свое изображение из памяти?
 

JuniorScripter

Новичок
58
23
Как в ini конфиг засунуть массив с текстом? Например что то типо этого в конфиге:
Lua:
nickNames = "James_Nickname","John_Bomj","Vasya_Pupkin"
А в игре проверять, если ли из этой информации аргумент введённый игроком.
 

FYP

Известный
Автор темы
Администратор
1,764
5,923
Ребят, я себе уже все голову сломал. Подскажите, почему не работает вот это:
в цикле нужно проверять isSampAvailable. т.е. while not isSampfuncsLoaded() or not isSampAvailable() do wait(1000) end
почему при таком условии, у меня ини файл не сохраняется в указанную мной папку?(Папка существует)
inicfg.save(Data, "Autoschool\\Autoschool.ini") end
Как получить массив киллстата?
только из памяти, готовых функций нет. int kill = sampGetKillInfoPtr()
Как загрузить свое изображение из памяти?
если средствами SAMPFUNCS, то bool result, int texture = renderLoadTextureFromFileInMemory(int pointer, int size)
pointer - адрес изображения в памяти, size - размер файла
Как в ini конфиг засунуть массив с текстом? Например что то типо этого в конфиге:
Lua:
nickNames = "James_Nickname","John_Bomj","Vasya_Pupkin"
А в игре проверять, если ли из этой информации аргумент введённый игроком.
сохранить его в виде строки с определённым форматом (например, ini.settings.array = table.concat(my_array, ', ')), а после чтения парсить с помощью string.gsub
 
  • Нравится
Реакции: eiuhuth и Bogach

JuniorScripter

Новичок
58
23
в цикле нужно проверять isSampAvailable. т.е. while not isSampfuncsLoaded() or not isSampAvailable() do wait(1000) end

inicfg.save(Data, "Autoschool\\Autoschool.ini") end

только из памяти, готовых функций нет. int kill = sampGetKillInfoPtr()

если средствами SAMPFUNCS, то bool result, int texture = renderLoadTextureFromFileInMemory(int pointer, int size)
pointer - адрес изображения в памяти, size - размер файла

сохранить его в виде строки с определённым форматом (например, ini.settings.array = table.concat(my_array, ', ')), а после чтения парсить с помощью string.gsub
Спасибо, но очень сложно чото ваши словечки - парсить и т.д. Ненавижу эти строки, сколько инфы не прочитал, везде объясняют ужасно.
 

ufdhbi

Известный
Проверенный
1,460
866
Помогите с установкой данной либы:
GitHub - zhaozg/lua-openssl: Openssl binding for Lua, which have LuaCrypto-compat module...(https://github.com/zhaozg/lua-openssl)
Поставил ssl.lua [moonloader/lib]
Http.lua [moonloader/lib]
В игре ловлю ошибку
Код:
[ML] (error) E:\GTA\moonloader\lib\ssl.lua:8: module 'ssl.core' not found:
    no field package.preload['ssl.core']
    no file 'E:\GTA\moonloader\lib\ssl\core.lua'
    no file 'E:\GTA\moonloader\lib\ssl\core\init.lua'
    no file 'E:\GTA\moonloader\ssl\core.lua'
    no file 'E:\GTA\moonloader\ssl\core\init.lua'
    no file '.\ssl\core.lua'
    no file 'E:\GTA\moonloader\lib\ssl\core.luac'
    no file 'E:\GTA\moonloader\lib\ssl\core\init.luac'
    no file 'E:\GTA\moonloader\ssl\core.luac'
    no file 'E:\GTA\moonloader\ssl\core\init.luac'
    no file '.\ssl\core.luac'
    no file 'E:\GTA\moonloader\lib\ssl\core.dll'
    no file 'E:\GTA\moonloader\lib\ssl.dll'

где взять этот core?

Спасибо, но очень сложно чото ваши словечки - парсить и т.д. Ненавижу эти строки, сколько инфы не прочитал, везде объясняют ужасно.
сделай лучше так, записывай в файл ники по 1 нику на строку:
Jo_Bet
Li_Russel
потом в скрипте функцией
Lua:
for nick in io.lines("moonloader/nicks.txt") do
  sampAddChatMessage(nick, -1)
end
 
Последнее редактирование модератором:

JuniorScripter

Новичок
58
23
Как сделать задержку вне main'a ?
Задача у меня такова - после реконекта на монсере выдаёт ошибку, я её хуком ловлю - но нужно 15 секунд подождать что бы не кикнуло.
Заранее большое спасибо.

сделай лучше так, записывай в файл ники по 1 нику на строку:
Jo_Bet
Li_Russel
потом в скрипте функцией
Lua:
for nick in io.lines("moonloader/nicks.txt") do
  sampAddChatMessage(nick, -1)
end
Спасибо большое, не подскажешь как записывать каждый раз на новую строчку? Ненавижу этот стринг, вообще не понятно. Скорей бы кто тутор сделали.
 
Последнее редактирование модератором: