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

Vespan

loneliness
Проверенный
2,101
1,633
Как узнать идёт ли сейчас капт,кто напал и на кого,и какая терра
можно хотябто одну функцию
 

Carrentine

Потрачен
569
460
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.

Dmitriy Makarov

25.05.2021
Проверенный
2,478
1,113
Как узнать идёт ли сейчас капт,кто напал и на кого,и какая терра
можно хотябто одну функцию
ну хукнуть текст с чата, как вариант
если ты на адвансе, то получится, если ты сам в банде, либо админ, на других проектах хз как происходит
 

deloren96

Новичок
11
13
Как не учитывать часть текста, если я поймал строку с помощью string.match, сохраняю ее и сравниваю в дальнейшем с другой строкой. И там есть информация, которая постоянно меняется, а мне нужно ее не учитывать при сравнении строк.
Пример строки: Vasya_Pupkin(111) | 30 минут | Состояние: Занят
И вот мне надо информацию о времени не учитывать, а имя и прочую информацию сравнивать.

Lua:
list = {}

function sampev.onServerMessage(color, text)
        name = string.match(text, '.+%(%d+%) | ')
        if name and table.contains(list, name) then
            return false
        end
        table.insert(list, name)
end


function table.contains(table, element)
  for _, value in pairs(table) do
    if value == element then
      return true
    end
  end
  return false
end
 

D3AMWYT

Участник
72
12
Как мне узнать Фамилии тех кто сидит рядом в моей машине? Что бы я мог типо написать "Фамилия выйди" и т.п.
 

Vespan

loneliness
Проверенный
2,101
1,633
Не рабоет
Lua:
-- SAMP.LUA*
    if string.find(text, 'Репорт от:') then -- Репорт от: Rinas_Bariev[17]. Название жалобы: ХП. (Ответить: /rep)
        idReport, Title = text:match('Репорт от: .+ %[(%d+)%]. Название жалобы: (.+) (Ответить: /rep)')
        PushMessage('[Report] Репорт от '..idReport..' id > '..Title)
    end
 

mld

Участник
99
11
Можно lua скрипты в отдельном exe делать,как у imring ?
Есть какие-то туторы,как сделать также,ибо я пытался,но чет через 5 точку :(
 

Вложения

  • 1574800817967.png
    1574800817967.png
    41.3 KB · Просмотры: 212

MrYurkoo

Известный
102
9
Окно imgui заполняется текстом. Когда текста слишком много, появляется ползунок, и это как бы является список. Текст идет сверху вниз, и мне нужно ЛИБО автоматическая прокрутка вниз (как-то сделать фокус), что при новом сообщении идёт вниз, ЛИБО сделать текст не сверху вниз, а снизу вверх.

Возможности?
 

Ibra9

Новичок
9
1
Lua:
require "lib.moonloader"
local keys = require 'vkeys'
local imgui = require 'imgui'
local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8
local text_buffer = imgui.ImBuffer(256)


function main()
if not isSampLoaded() or not isSampfuncsLoaded() then return end
while not isSampAvailable() do wait(100) end
sampRegisterChatCommand('helper', cmd_imgui)
 imgui.Process = false
end

 function cmd_imgui(arg)
 main_window_state.v = not main_window_state.v
 imgui.Process = main_window_state.v
 end 

local main_window_state = imgui.ImBool(false)
function Imgui.OnDrawFrame()
imgui.Begin("Test script")
imgui.InputText(u8'Тест', text_buffer)
imgui.End()
end
 
Последнее редактирование:

koncumone

Известный
337
87
Lua:
function onDialogShow(dialogId, dialogStyle, dialogTitle, okButtonText, cancelButtonText, dialogText)
    if dialogId == 133 then
        sendDialog(133,1,0,'')
    end
end
почему не пашет?
не отправляет диалогу, это диалог входи в автосалон, надо чтобы он нажал кнопочку первую, тоисть да
 

Hatiko

Известный
Проверенный
1,472
611
Есть какие-то средства запуска exe файла по средством кода в скрипте? Пробовал os.execute и ShellExecuteA - не робит.
 

Cake_

Известный
Проверенный
263
313

Vespan

loneliness
Проверенный
2,101
1,633
Почему не работает?
Lua:
-- SAMP.LUA **
    if string.find(text, 'Репорт от:') then
--Репорт от: Maxim_Mikhaylov[5]. Название жалобы: Друг. (Ответить: /rep)
        idReport, Title = text:match('Репорт от: .+%[(%d+)%]. Название жалобы: (.+) (Ответить: /rep)')
        sampAddChatMessage('>>'..idReport..' >>'..Title, -1)
    end
-- idReport = от кого репорт(ид) | Title = название жалобы
Код:
[10:31:32.869800] (error)    Admin Tools: D:\GTASHKA\moonloader\Admin Tools [Gold-Rp].lua:1989: attempt to concatenate global 'Title' (a nil value)
stack traceback:
    D:\GTASHKA\moonloader\Admin Tools [Gold-Rp].lua:1989: in function 'callback'
    D:\GTASHKA\moonloader\lib\samp\events\core.lua:77: in function 'process_event'
    D:\GTASHKA\moonloader\lib\samp\events\core.lua:100: in function 'process_packet'
    D:\GTASHKA\moonloader\lib\samp\events\core.lua:127: in function <D:\GTASHKA\moonloader\lib\samp\events\core.lua:126>
[10:31:32.888799] (error)    Admin Tools: Script died due to an error. (0DC4C44C)
 

Petr_Sergeevich

Известный
Проверенный
707
296
Почему не работает?
Lua:
-- SAMP.LUA **
    if string.find(text, 'Репорт от:') then
--Репорт от: Maxim_Mikhaylov[5]. Название жалобы: Друг. (Ответить: /rep)
        idReport, Title = text:match('Репорт от: .+%[(%d+)%]. Название жалобы: (.+) (Ответить: /rep)')
        sampAddChatMessage('>>'..idReport..' >>'..Title, -1)
    end
-- idReport = от кого репорт(ид) | Title = название жалобы
Код:
[10:31:32.869800] (error)    Admin Tools: D:\GTASHKA\moonloader\Admin Tools [Gold-Rp].lua:1989: attempt to concatenate global 'Title' (a nil value)
stack traceback:
    D:\GTASHKA\moonloader\Admin Tools [Gold-Rp].lua:1989: in function 'callback'
    D:\GTASHKA\moonloader\lib\samp\events\core.lua:77: in function 'process_event'
    D:\GTASHKA\moonloader\lib\samp\events\core.lua:100: in function 'process_packet'
    D:\GTASHKA\moonloader\lib\samp\events\core.lua:127: in function <D:\GTASHKA\moonloader\lib\samp\events\core.lua:126>
[10:31:32.888799] (error)    Admin Tools: Script died due to an error. (0DC4C44C)
Скобки нужно экранировать
Вот полный список символов:
( ) . % + - * ? [ ^ $
Lua:
local id, title = text:match('Репорт от: .+%[(%d+)%]%. Название жалобы: (.+) %(Ответить: /rep%)')
 
  • Нравится
Реакции: Benya и Vespan