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

SamuraiHack

Новичок
9
2
Пацаны, вот есть у меня имгуи, допустим есть два поля, как сделать так что бы в первом поле была полна команда, а во втором ее сокращение, и по сокращению можно было бы юзать полную команду?
 

brabus

Участник
47
14
Пацаны, вот есть у меня имгуи, допустим есть два поля, как сделать так что бы в первом поле была полна команда, а во втором ее сокращение, и по сокращению можно было бы юзать полную команду?
Не понял, какие команды?
 

paulohardy

вы еще постите говно? тогда я иду к вам
Всефорумный модератор
1,892
1,255
Пацаны, вот есть у меня имгуи, допустим есть два поля, как сделать так что бы в первом поле была полна команда, а во втором ее сокращение, и по сокращению можно было бы юзать полную команду?
если готовые поля есть - добавь к ним рядом кнопку, при нажатии на которую команда будет регистрироваться полную команду в переменную full, сокращенную в skr
Lua:
if imgui.Button("reg") then
sampRegisterChatCommand(skr, function() sampSendChat(full) end)
end
 

SamuraiHack

Новичок
9
2
код:
function sampeve.onSendChat(command)
      for i=1,sl.countLink do
        if ini2["Options_"..i] ~= nil and ini2["Options_"..i].TypeBind == "command" and ini2["Options_"..i].Command == command:gsub("/","") then
          if not thrBind[i] or thrBind[i].dead then
            thrBind[i] = lua_thread.create(keyBindThread, i)
          else
            thrBind[i]:terminate()
          end
        end
подскажите как работает данная функция и как ее использовать в имуги.
 

paulohardy

вы еще постите говно? тогда я иду к вам
Всефорумный модератор
1,892
1,255
код:
function sampeve.onSendChat(command)
      for i=1,sl.countLink do
        if ini2["Options_"..i] ~= nil and ini2["Options_"..i].TypeBind == "command" and ini2["Options_"..i].Command == command:gsub("/","") then
          if not thrBind[i] or thrBind[i].dead then
            thrBind[i] = lua_thread.create(keyBindThread, i)
          else
            thrBind[i]:terminate()
          end
        end
подскажите как работает данная функция и как ее использовать в имуги.
функция sampeve.onSendChat(command) перехватывает сообщения отправляемые серверу. То что написано ниже - не очень понятно, ибо код не полный. По кускам можно понять что при вводе команды из ini файла запускается функция keyBindThread или скрипт завершает свою работу
 

SamuraiHack

Новичок
9
2
функция sampeve.onSendChat(command) перехватывает сообщения отправляемые серверу. То что написано ниже - не очень понятно, ибо код не полный. По кускам можно понять что при вводе команды из ini файла запускается функция keyBindThread или скрипт завершает свою работу
Спасибо
 

BlackGoblin

Известный
519
215
Приветствую. Есть диалог, в диалоге постоянно меняются местами строки с выбором в меню. Т.е было действие персонажа на одном месте, в другой ситуации стало на другом. Как в такой ситуации сделать так, чтобы парсился диалог и выбирался тот пункт, который совпадает по тексту?
 

ARI

Участник
63
11
://
ошибка:
script.lua: C:\GTA San AndreasCLEAR\moonloader\script.lua:32: attempt to yield across C-call boundary
stack traceback: ( я так понимаю это переводится примерно как "попытка перепрыгнуть через C-call границу, "
[C]: in function 'wait'

Кто знает что за ошибка и как от нее избавиться?
Появляется в следующей строчке кода:

while not sampIsLocalPlayerSpawned(id) do
wait(100) -- использовал разные значения задержки, не помогло
end

Я предполагая что связано это с бесконечной задержкой, которую я объявляю в main функции, но ее я тоже убрать не могу :/
Спасибо.
 

штейн

Известный
Проверенный
1,001
687
://
ошибка:
script.lua: C:\GTA San AndreasCLEAR\moonloader\script.lua:32: attempt to yield across C-call boundary
stack traceback: ( я так понимаю это переводится примерно как "попытка перепрыгнуть через C-call границу, "
[C]: in function 'wait'

Кто знает что за ошибка и как от нее избавиться?
Появляется в следующей строчке кода:

while not sampIsLocalPlayerSpawned(id) do
wait(100) -- использовал разные значения задержки, не помогло
end

Я предполагая что связано это с бесконечной задержкой, которую я объявляю в main функции, но ее я тоже убрать не могу :/
Спасибо.
используй задержку в потоках:
Lua:
lua_thread.create(function()
    -- body
end)
 

astynk

Известный
Проверенный
742
530
Приветствую. Есть диалог, в диалоге постоянно меняются местами строки с выбором в меню. Т.е было действие персонажа на одном месте, в другой ситуации стало на другом. Как в такой ситуации сделать так, чтобы парсился диалог и выбирался тот пункт, который совпадает по тексту?
Lua:
local i = 0
for line in sampGetDialogText():gmatch('[^\n]+') do
    if line == 'Текст нужного пункта' then
        sampSetCurrentDialogListItem(i)
        break
    end
    i = i + 1
end
Не забывай про цветовые теги, пробелы и \t, из-за которых проверка на равенство может не сработать.
 
  • Нравится
Реакции: BlackGoblin

ruslanester

Известный
10
1
как определить что написал юзер, например написал в чат, /pe 45 - нужно записать в отдельную переменную 45
 

ГОХА | GoxaShow

В АРМИИ С 12.12,ЗАКАЗЫ НЕ ДЕЛАЮ,ТУПЫЕ ВОПРОСЫ-НАХУ
Проверенный
1,871
1,872
привет, снова прошу помощи, вообщем есть диалог сервера c вводом текста с определенным идом(154), как мне сделать, чтобы в этот диалог(место для ввода текста) входили только цифры, без букв и символов? буду очень признателен
 

d3x.m4nt1s

Потрачен
48
59
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
привет, снова прошу помощи, вообщем есть диалог сервера c вводом текста с определенным идом(154), как мне сделать, чтобы в этот диалог(место для ввода текста) входили только цифры, без букв и символов? буду очень признателен
Хардкорный вариант, из побочных эффектов - при попытке ввода символа, не являющегося цифрой, каретка смещается в конец.
Lua:
while true do wait(1)
    if sampIsDialogActive() and sampGetCurrentDialogId() == 154 then
        local text = sampGetCurrentDialogEditboxText()
        if text:find('[^%d]') then
            sampSetCurrentDialogEditboxText(text:gsub('[^%d]', ''))
        end
    end
end
 
Последнее редактирование:
  • Нравится
Реакции: ГОХА | GoxaShow

Maksemkafdspaojfsa

Новичок
1
0
Ребят, чем можно открывать lua скрипты? какой программой. Вот кс например сани билдер. а луа