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

Izvinisb

Известный
Проверенный
963
600
Как сделать проверку на то, что именной твой игрок сидит на пассажирском или водительском месте. По типу, если на водительском, то возвращала 1, если на пассажирском, то возвращало 2.
Lua:
if PLAYER_PED == getDriverOfCar(storeCarCharIsInNoSave(PLAYER_PED)) then
 

D.Makarov

Участник
146
3
function main()
sampRegisterChatCommand("fish", function(arg)
sampSendClickTextdraw("688"..arg)
sampSendClickTextdraw("693"..arg)
sampSendClickTextdraw("690"..arg)
sampSendClickTextdraw("695"..arg)
sampSendClickTextdraw("694"..arg)
sampSendClickTextdraw("689"..arg)
sampSendClickTextdraw("691"..arg)
sampSendClickTextdraw("688"..arg)
sampSendClickTextdraw("693"..arg)
sampSendClickTextdraw("690"..arg)
sampSendClickTextdraw("695"..arg)
sampSendClickTextdraw("694"..arg)
sampSendClickTextdraw("689"..arg)
sampSendClickTextdraw("691"..arg)
end)
wait(-1)
end
как сделать так что бы когда я прописывал команду это постоянно повторялось
 
  • Bug
Реакции: Izvinisb

wulfandr

Известный
636
260
function main()
sampRegisterChatCommand("fish", function(arg)
sampSendClickTextdraw("688"..arg)
sampSendClickTextdraw("693"..arg)
sampSendClickTextdraw("690"..arg)
sampSendClickTextdraw("695"..arg)
sampSendClickTextdraw("694"..arg)
sampSendClickTextdraw("689"..arg)
sampSendClickTextdraw("691"..arg)
sampSendClickTextdraw("688"..arg)
sampSendClickTextdraw("693"..arg)
sampSendClickTextdraw("690"..arg)
sampSendClickTextdraw("695"..arg)
sampSendClickTextdraw("694"..arg)
sampSendClickTextdraw("689"..arg)
sampSendClickTextdraw("691"..arg)
end)
wait(-1)
end
как сделать так что бы когда я прописывал команду это постоянно повторялось
а аргументы тебе зачем
 

D.Makarov

Участник
146
3
а аргументы тебе зачем
всм
function main()
sampRegisterChatCommand("fish", function(arg)
sampSendClickTextdraw("688"..arg)
sampSendClickTextdraw("693"..arg)
sampSendClickTextdraw("690"..arg)
sampSendClickTextdraw("695"..arg)
sampSendClickTextdraw("694"..arg)
sampSendClickTextdraw("689"..arg)
sampSendClickTextdraw("691"..arg)
sampSendClickTextdraw("688"..arg)
sampSendClickTextdraw("693"..arg)
sampSendClickTextdraw("690"..arg)
sampSendClickTextdraw("695"..arg)
sampSendClickTextdraw("694"..arg)
sampSendClickTextdraw("689"..arg)
sampSendClickTextdraw("691"..arg)
end)
wait(-1)
end
как сделать так что бы когда я прописывал команду это постоянно повторялось
хелп
 
Последнее редактирование:

_ex$tanOr_

Участник
125
19
У текстдрава лопаты, скорее всего, не настоящий id модели. Как это можно решить через перехват нажатых текстдравов? Помогите
sa-mp-002.png
 

wulfandr

Известный
636
260
У текстдрава лопаты, скорее всего, не настоящий id модели. Как это можно решить через перехват нажатых текстдравов? Помогите
через showtdid узнаёшь ид лопаты
 

meowprd

Тот самый Котовский
Проверенный
1,278
721
Lua:
function main()
    sampRegisterChatCommand("cmd", func_cmd)

    while true do wait(0) end
end

function func_cmd(arg)
    lua_thread.create(function()
    sampSendClickTextdraw("688"..arg)
    sampSendClickTextdraw("693"..arg)
    sampSendClickTextdraw("690"..arg)
    sampSendClickTextdraw("695"..arg)
    sampSendClickTextdraw("694"..arg)
    sampSendClickTextdraw("689"..arg)
    sampSendClickTextdraw("691"..arg)
    sampSendClickTextdraw("688"..arg)
    sampSendClickTextdraw("693"..arg)
    sampSendClickTextdraw("690"..arg)
    sampSendClickTextdraw("695"..arg)
    sampSendClickTextdraw("694"..arg)
    sampSendClickTextdraw("689"..arg)
    sampSendClickTextdraw("691"..arg)
    return end)
end
 

Curtis

Участник
282
10
У меня есть тэг для команды /f и после отправки должно в чате отобразится "/f *ТЭГ* Текст". Тэг предварительно вводится через input строку, но когда я захожу проверить, у меня команда /f не работает, в консоле СампФункс пишет " RegisterCommand Error: Command "f" already exists ". Если я заменю /f на /ff, к примеру", ну чтобы в конце было также "/f *ТЭГ* Текст", то все работает. У меня есть тэги и на другие команды, там все работает отлично
 

Dmitriy Makarov

25.05.2021
Проверенный
2,505
1,134
У меня есть тэг для команды /f и после отправки должно в чате отобразится "/f *ТЭГ* Текст". Тэг предварительно вводится через input строку, но когда я захожу проверить, у меня команда /f не работает, в консоле СампФункс пишет " RegisterCommand Error: Command "f" already exists ". Если я заменю /f на /ff, к примеру", ну чтобы в конце было также "/f *ТЭГ* Текст", то все работает. У меня есть тэги и на другие команды, там все работает отлично
RegisterCommand Error: Command "f" already exists
Тебе говорят, что такая команда у тебя в скриптах уже существует, а так низя.)
Либо удали команду /f с другого скрипта, где он у тебя есть, либо измени её.
 
  • Нравится
Реакции: Curtis

KashMar

Новичок
22
1
Есть ли способ сделать так, чтобы все игроки видели перекраску автомобиля?
 

Luis_Mora

Участник
31
1
И снова регулярка.
Нужно для строки
Младший Лейтенант Nick_Name: text
в рацию, выделить из всей этой строки Всё что до ника, сам ник, и текст после ника.
Причём нужно избежать такой ситуации если будет в тексте например : либо же _ (например никнейм или [Tag]: ).
Также есть момент что звание может быть одним словом, например: Прапорщик Nick_Name: text
Если кратко. Нужно выделить 3 переменные. 1) весь текст с пробелами и тд между !самым первым пробелом! и пробелом !перед! Nick_Name. 2) Сам ник 3) ну и всё что после.
Сижу уже достаточно много. Всё никак не получается прийти к этому верному решению.


Lua:
if text:find('_') and text:find(':') then
            if color == -1920073984 then
                local txL, nameF, txR = text:match('(.+)%s(%S+):%s(.+)') --text:match("^(%S+)%s+(%g+):%s*(.+)")
                local id = findPlayerByName(nameF)
                local colorN = sampGetPlayerColor(id)
                if txR ~= nil and txL ~= nil then
                    sampAddChatMessage(txL .. " " ..  nameF .. " [" .. id .."]{8D8DFF}: " .. txR , colorN)
                    print(txL .. " "  .. nameF .. "[ID]: " .. txR)
                    return false
                end
            end
        end
 

Curtis

Участник
282
10
Спасибо, реально помогло, а то я был в недоумении, что делать.
У меня тут ещё одна проблемка есть, если я пишу в Input строке на кириллице. после релога / сохранения несколько раз, появляться "????" вместо текста.
imgui.InputText(u8"##1", text_prefix)
 

Dmitriy Makarov

25.05.2021
Проверенный
2,505
1,134
Если между двумя проверками есть or то нужное действие скрипт сделает для обеих проверок или только для одной?
К примеру, если мне нужно заблокировать 2 строки с разными цветами, то чтобы заблокировать обе строки, нужно сделать проверку через or или and?
Lua:
if color == 13369599 and color == 10027263 then return false
-- or
if color == 13369599 or color == 10027263 then return false
 

Fott

Простреленный
3,462
2,378
Если между двумя проверками есть or то нужное действие скрипт сделает для обеих проверок или только для одного?
К примеру, если мне нужно заблокировать 2 строки с разными цветами, то чтобы заблокировать обе строки, нужно сделать проверку через or или and?
Lua:
if color == 13369599 and color == 10027263 then return false
-- or
if color == 13369599 or color == 10027263 then return false
Через or
Если цвет == 13369599 или же цвет == 10027263 тогда блок. (Это пример с or)
Если же ты заюзаешь and то строка будет так: если цвет == 13369599 и цвет == 10027263 тогда блок
 
  • Нравится
Реакции: Dmitriy Makarov