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

AnWu

https://t.me/anwublog
Всефорумный модератор
4,761
5,369
Как получить цвет сообщения в сампе? Который задается через "SendClientMessage("текст", цвет)"
Серверные через SAMP.Lua -> onServerMessage(color, text)
Скриптовые - sampGetChatString()

Как удалить СОДЕРЖИМОЕ текстового документа? Не сам текстовый документ, а всё, что есть в нём.
Удалить и создать файл.
 

#Northn

Pears Project — уже запущен!
Всефорумный модератор
2,650
2,535
Серверные через SAMP.Lua -> onServerMessage(color, text)
Скриптовые - sampGetChatString()


Удалить и создать файл.
Не сам текстовый документ, а всё, что есть в нём.

Удаление и создание файла работает не всегда, когда циклом вывожу текст из документа, то он не удаляется, якобы открыт в gta_sa.exe, но содержимое можно поменять.

UPD: Открыть текстовый документ в режиме w+ и закрыть его, тогда всё удалится.
 
Последнее редактирование:

Musaigen

abobusnik
Проверенный
1,607
1,365
Как сделать необязательную проверку?
Lua:
function main()
if check then
-- код проверки типо, потом уже идёт "обычная функция"
-- или иначе, если переменная check = false,  то идёт уже обычная функция, но без проверки
end
-- обычная функция

end

function check()
    check = true
end
 

MrCreepTon

Неизвестный
Всефорумный модератор
2,201
4,978
Как сделать необязательную проверку?
Lua:
function main()
if check then
-- код проверки типо, потом уже идёт "обычная функция"
-- или иначе, если переменная check = false,  то идёт уже обычная функция, но без проверки
end
-- обычная функция

end

function check()
    check = true
end
Lua:
function checki() --Что бы скрипт не путал функцию с переменной - переименовал функцию
    check = true
end

function func()
    --Код обычной функции
end

function main()
if check then
--Здесь код проверки
func() -- Вызываем функцию
else
    func() -- Просто вызываем функцию
end
end
 

Musaigen

abobusnik
Проверенный
1,607
1,365
Lua:
function checki() --Что бы скрипт не путал функцию с переменной - переименовал функцию
    check = true
end

function func()
    --Код обычной функции
end

function main()
if check then
--Здесь код проверки
func() -- Вызываем функцию
else
    func() -- Просто вызываем функцию
end
end
а если проверок дохуя и больше?
 

f0rtrix

Известный
208
15
Вопрос про, так называемые, теги.
Lua:
 local {name} = sampGetPlayerIdByCharHandle(PLAYER_PED)
Понятное дело работать не будет, оно мне сразу и выдает ошибку. Но как сделать эти теги?
Что бы при вводе в скрипте:
Меня зовут {name}
Выводило в чат
Меня зовут FORTRIX
 

AnWu

https://t.me/anwublog
Всефорумный модератор
4,761
5,369
Вопрос про, так называемые, теги.
Lua:
 local {name} = sampGetPlayerIdByCharHandle(PLAYER_PED)
Понятное дело работать не будет, оно мне сразу и выдает ошибку. Но как сделать эти теги?
Что бы при вводе в скрипте:
Меня зовут {name}
Выводило в чат
Меня зовут FORTRIX
string.gsub(string, "<name>", "Меня зовут " .. sampGerPlayerNickname(228))
 

Musaigen

abobusnik
Проверенный
1,607
1,365
Как сделать чтобы текст через InputTextMultiline не писался в одну строчку?
 

Musaigen

abobusnik
Проверенный
1,607
1,365
Смысле? При получении?
Lua:
local buf = imgui.ImBuffer(1024)

function imgui.OnDrawFrame()
   -- ...
  imgui.InputTextMultiline('CHLEN', buf)
  -- 1 строчка: XYU
  -- 2: строчка: 1337
sampSendChat(buf.v)
-- Напишет XYU 1337 в одну строчку
-- Хотя нужно чтобы было в две строки
end
 

AnWu

https://t.me/anwublog
Всефорумный модератор
4,761
5,369
Lua:
local buf = imgui.ImBuffer(1024)

function imgui.OnDrawFrame()
   -- ...
  imgui.InputTextMultiline('CHLEN', buf)
  -- 1 строчка: XYU
  -- 2: строчка: 1337
sampSendChat(buf.v)
-- Напишет XYU 1337 в одну строчку
-- Хотя нужно чтобы было в две строки
end
Так это не работает.
Дели текст по строкам:
Lua:
for line in string.gmatch(buf.v, "[^\r\n]") do
    sampSendChat(line)
end
 

f0rtrix

Известный
208
15
Lua:
               if isKeysDown(mainIni.Keys.hkbind1) then
                   local file = io.open(getWorkingDirectory() .. '\\papka\\papka\\Профиль 1.txt', 'r+')
                       for line in file:lines() do
                           wait(1000)
                           local text = u8:decode(line)
                           local test = string.gsub(text, "{name}", my)
                           local test = string.gsub(text, "{sur}", rp)
                           local test = string.gsub(text, "{numb}", numb)
                           sampSendChat(test)
                       end
                   file:close()
               end
Я не знаю как еще сделать так, что бы оно заменяло {name} {sur} {numb} на нужные мне значения. Мб просто уже поздно и я не соображаю, но помогите, пожалуйста. Что бы в одной строчке можно было поместить хоть все три тега или один.
 

AnWu

https://t.me/anwublog
Всефорумный модератор
4,761
5,369
Lua:
               if isKeysDown(mainIni.Keys.hkbind1) then
                   local file = io.open(getWorkingDirectory() .. '\\papka\\papka\\Профиль 1.txt', 'r+')
                       for line in file:lines() do
                           wait(1000)
                           local text = u8:decode(line)
                           local test = string.gsub(text, "{name}", my)
                           local test = string.gsub(text, "{sur}", rp)
                           local test = string.gsub(text, "{numb}", numb)
                           sampSendChat(test)
                       end
                   file:close()
               end
Я не знаю как еще сделать так, что бы оно заменяло {name} {sur} {numb} на нужные мне значения. Мб просто уже поздно и я не соображаю, но помогите, пожалуйста. Что бы в одной строчке можно было поместить хоть все три тега или один.
Ты каждый раз записываешь в переменную тест новое значение. Зачем?
Зачем ты используешь u8:decode? У тебя файл в UTF-8?
Работай только с переменной тест.
 

f0rtrix

Известный
208
15
Зачем ты используешь u8:decode? У тебя файл в UTF-8?
Методом тыка я определил, что если не ставить u8:decode, то оно работать не будет :D
---
Работай только с переменной тест.
Понял... принял... обработал... намекни как сделать для переменной test множество, так называемых, условий, если тут так можно сказать :D