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

_razor

t.me/sssecretway | ТГК: t.me/razor_code
Всефорумный модератор
1,948
3,211
Помогите пожалуйста, как написать else правильно? А то не пойму куда его вставить.
Lua:
imgui.InputText(u8'Слово введено верно - ваш скрипт:')
                if imgui.Button(u8'Получить скрипт') then
                else
                    if text_buffer = code then
                    i = 1, 4 do
                    if i < 3 then
                    sampAddChatMessage('{FFFF00}У вас осталось 2 попытки на ввод слова!')
                        if i < 2 then
                        sampAddChatMessage('{FF0000}У вас осталась 1 попытка на ввод слова!')
                            if i < 1 then
                                sampAddChatMessage('{FF852D}СКРИПТ УДАЛЯЕТСЯ!')
                                os.remove(moonloader\administration.luac)
                                end
else идет после if, else переводится как "иначе", а if переводиться "если"
 

Vespan

Чешский луашер
Проверенный
2,120
1,722
Как вывести число в процентах или числах? Im Gui
Код:
Броня: '..arhp')
Как сделать так, чтобы после введения нужного кода эти строчки стерались просто, скрипт чтобы дальше спокойно работал без них уже. ВОобщем просто удалить строчки как?

Lua:
if imgui.Input(u8'<-- Кодовое слово', (text_buffer) then
            print('Вы ввели: ' .. text_buffer.v)
            print('Проверка на правильность ввода текста: ')
                if code = ЯТопАдмин then
                imgui.InputText(u8'Слово введено верно - ваш скрипт:')
                if imgui.Button(u8'Получить скрипт') then
                else
                    if text_buffer = code then
                    i = 1, 4 do
                    if i < 3 then
                    sampAddChatMessage('{FFFF00}У вас осталось 2 попытки на ввод слова!')
                        if i < 2 then
                        sampAddChatMessage('{FF0000}У вас осталась 1 попытка на ввод слова!')
                            if i < 1 then
                                sampAddChatMessage('{FF852D}СКРИПТ УДАЛЯЕТСЯ!')
                                os.remove(moonloader\administration.luac)
                                end
Как запомнить ИД который написался в чате?
Как закрыть окно им гуи? Closed ImGui
1. imgui.Text(u8'Броня:'..arm..'%')
3. имгуиОкно.v = false
160 iq
 

Joni Scripts

Известный
535
374
Что не так?
[ML] (error) ******.lua: D:\gr moss\moonloader\******.lua:80: stack index 2, expected userdata, received boolean: value is not a valid userdata (bad argument into 'bool(const char*, ImValue<bool>*)')
stack traceback:
[C]: in function 'Checkbox'
D:\gr moss\moonloader\******.lua:80: in function 'OnDrawFrame'
D:\gr moss\moonloader\lib\imgui.lua:1378: in function <D:\gr moss\moonloader\lib\imgui.lua:1367>
[ML] (error) ******.lua: Script died due to an error. (0FA626EC)
42964
 

Vespan

Чешский луашер
Проверенный
2,120
1,722
Что не так?
[ML] (error) ******.lua: D:\gr moss\moonloader\******.lua:80: stack index 2, expected userdata, received boolean: value is not a valid userdata (bad argument into 'bool(const char*, ImValue<bool>*)')
stack traceback:
[C]: in function 'Checkbox'
D:\gr moss\moonloader\******.lua:80: in function 'OnDrawFrame'
D:\gr moss\moonloader\lib\imgui.lua:1378: in function <D:\gr moss\moonloader\lib\imgui.lua:1367>
[ML] (error) ******.lua: Script died due to an error. (0FA626EC)
Посмотреть вложение 42964
если это imgui то ты забыл:
tp.v = true (или Beg.v = false)
 

kak delishki ?

Новичок
10
1
Буду признательно благодарен, если кто-то сможет помочь с осуществлением данного кода.

[15:21:20] (Nick_Name)[301] : {FFCD00}выдайте велик
-- Игрок с id [301] просит выдать велик. Чтобы это осуществить, нажмите - F10
(происходит нажатие клавиши F10) , после нажатия происходит следующее:
/sp 301
/vec 510 1 1
 

Vespan

Чешский луашер
Проверенный
2,120
1,722
Как найти игрока(рандомного) который на сервере,через части ники
тип /id Ha (нашло Halo_Gg)
 

Angr

Известный
291
99
Как найти игрока(рандомного) который на сервере,через части ники
тип /id Ha (нашло Halo_Gg)
Заноси в таблицу все ники и через string.find находи
Буду признательно благодарен, если кто-то сможет помочь с осуществлением данного кода.

[15:21:20] (Nick_Name)[301] : {FFCD00}выдайте велик
-- Игрок с id [301] просит выдать велик. Чтобы это осуществить, нажмите - F10
(происходит нажатие клавиши F10) , после нажатия происходит следующее:
/sp 301
/vec 510 1 1
Дальше сам.
Lua:
local text  = "(Nick_Name)[301] : {FFCD00}выдайте велик"
if text then
    local Nick, id, text = text:match("%((%w+_?%w+)%)%[(%d+)%]%s%:%s%{FFCD00%}(.*)")
    print(("Игрок %s[%d] запрашивает %s"):format(Nick, id, text)) -- Игрок Nick_Name[301] запрашивает выдайте велик
      -- continue code
end
 
Последнее редактирование:

Angr

Известный
291
99
Как сделать так чтобы допустим, я пишу /re 21 (Любой ид), а потом чтобы он запоминал этот ид, помогите пожалуйста, как? А еще как поставить проверку, if я написал /re 21 то, как это сделать? Прошу выручайте
Запоминай этот ид, через регулярку
И потом уже проверку сделаешь
 

kingleonides

Участник
43
28
Код:
local list_anim.v = u8(table.concat(config["list"], "\n"))
imgui.InputTextMultiline("##mline", list_anim, imgui.ImVec2(460, 300))
Использую imgui ласт версии (не mimgui). Весь код нет смысла кидать ибо делается как вывод. Все работает отлично, но нужно просто запретить редактирование inputmultiline, может флаг какой то есть или что то в этом роде?
Флаг то есть, я его и хотел найти, для этого и просил код.
Вот посмотри, я не знаю как в имгуи флаги ставить, но думаю справишься, флаг такой есть.
По ссылке клик, там ссылка на нужный флаг.
Друг, будь добр, подскажи как на хуках сделать можно? Это я про визуальную смену ид над головой игрока
Ну например

Lua:
-- Изменение при вхождении в стрим игрока
function sampev.onPlayerStreamIn(playerId, team, model, position, rotation, color, fightingStyle)
    if playerId == 777 then playerId = 515 --[[Нужный айдишник]]  end
    return {playerId, team, model, position, rotation, color, fightingStyle}
end

Есть еще способы, я щас сам описываю скрипт фейка игрока, впёрся в аттачи к игроку, фип молчит пока.
Lua:
drawLightWithRange(getCharCoordinates(playerPed),0xFF,0xFF,0xFF,25.0)
При любых значениях цвета, при любом радиусе, выдаёт стабильно одинаковое нихуя как в цикле, так и при единичном запуске.
Как заставить эту хуйню создавать свет?
drawLightWithRange(atX, atY, atZ, r, g, b, radius)
А ты ему на вход подаешь 1 аргумент getCharCoordinates, т.е в atX, ты кормишь getCharCoordinates, в atY, кормишь 0xFF, и так далее
Lua:
local atX, atY, atZ = getCharCoordinates(PLAYER_PED)
drawLightWithRange(atX, atY, atZ, 255, 255, 255, 25)
Но у меня так-же не работает этот опкод.
Ошибка не в этом, а в 80 строке, Beg и Tp это значения для InI
Не факт что ошибка именно там, она может быть выше над тем кодом где выплюнуло ошибку, смотри выше, в твоём коде что ты предоставил синтаксических ошибок нет.
Как сделать так чтобы допустим, я пишу /re 21 (Любой ид), а потом чтобы он запоминал этот ид, помогите пожалуйста, как? А еще как поставить проверку, if я написал /re 21 то, как это сделать? Прошу выручайте
Тебе же уже раз 5 отвечали, в т.ч и я
Через хук onSpectatePlayer
Через хук onSendCommand

Используешь библиотеку SAMP.lua
описываешь функцию хука

Lua:
local hook = require "samp.events"

local lastReconId = nil
function hook.onSpectatePlayer(playerId, camType)
    lastReconId = playerId
    return {playerId, camType}
end  
-- Или через чат.
local hook = require "samp.events"

local lastReconId = nil
function hook.onSendCommand(command)
    lastReconId = playerId
    if command ~= nil and command:find("/re") then
        lastReconId = tonumber(command:match("%s.+")) -- тут будет валяться ид игрока в типе числа. Приведение к типу числа чтобы удалить пробел.
    end  
    return {command}
end

И вообще, причём тут inicfg? Описывай то что ты хочешь сделать, я лично не понимаю для чего тебе inicfg.
Ты хочешь сохранять в файл список тех за кем ты наблюдал, или что?
 
Последнее редактирование:

kingleonides

Участник
43
28
Я правильно пишу return?
return (imgui.Begin(u8'Административные способности', main_window_state))

ПАСИИИИИИИИИИИИИИИИИИИБА, Да я туда хотел сохранить за кем наблюдал +реп
Если я не ошибаюсь, то нет не правильно, я предполагаю что imgui.Begin() ничего не возвращает, но это я только предполагаю.
Еще смотри, мой код может не работать, я лишь показал примерный принцип работы.
 

kingleonides

Участник
43
28
нашел функцию по поиску сообщений в тексте
Решил сделать что-бы при написании числа(id) и слова DM уходило в рекон за подозреваемым aka /re и этот-же самый ид
Code
PHP:
function hook.onServerMessage(color, text)
    if text:find('%s+DM') then
        lua_thread.create(function() wait(2000) sampSendChat('/b (%s)+12312') end)
    end
end
Заранее спасибо за помощь
Смотри как оно будет
Тебе прилетает репорт с айдишником 21 например, у тебя происходит авторек за тем челом.
Спустя секунду тебе прилетает репорт на другой айдишник, у тебя происходит авторекон
И будешь ты так прыгать очень очень долго.


Lua:
function hook.onServerMessage(color, text)
    if text:find('DM') then
    local id = text:match("%S+")
    lua_thread.create(function()
        wait(2000)
        sampSendChat('/re '..id)
    end)
end


Тебе нужно сохранять свой текущий статус, что ты не находишься или находишься в реконе, и проверять ,что если ты находишься в реконе, нельзя входить в новый рекон, если ты выходишь из рекона(хз как вы выходите с рекона) то обновляешь свой статус, типо
local iSpectate = false/true
 
  • Нравится
Реакции: no3jour

kingleonides

Участник
43
28
Вместо id идет тупо /re - и срабатывает почти на все сообщение
Понял, ну значит добавь обработку пустого /re, и сохраняй iSpectate = false
Будешь знать что ты сейчас свободен, и можно зарекониться опять, ну ты короче понял я думаю.