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

chapo

🫡 В армии с 17.10.2023. В ЛС НЕ ОТВЕЧАЮ
Друг
8,747
11,157
Помогите пожалуйста, как можно сделать флудер вне вечного цикла? Т.к. задержка в вечном цикле влияет на открытие имгуи окна
создать второй беск цикл
Lua:
function main()
    while not isSampAvailable() do wait(0) end
    flooder()
    while true do
        wait(0)
        
    end
end

function flooder()
    lua_thread.create(function()
        while true do
            wait(5000)
            sampSendChat('хуй')
        end
    end)
end
 
  • Нравится
Реакции: Стэнфорд

sep

Известный
672
76
почему скрипт работает так как недолжен
я думал так
(1 вариант)
if name ~= "1" and name ~= "2" then
значит ник 1 и 1
(2 вариант)
if name ~= "1" or name ~= "2" then
значит ник 1 или 2

в 1 варианте он должен проверять сразу 2 ника и скрипт недолжен работать так как сразу может быть только один ник
во 2 варианте провертка идет или на 1 или на 2 ник и скрипт должен работаеть если ник хоть какойто совпадает

пример скрипта
код:
name = sampGetPlayerNickname(select(2, sampGetPlayerIdByCharHandle(PLAYER_PED)))
if name ~= "1" and name ~= "2" then
sampAddChatMessage("текст", -1)
thisScript():unload()
end


если какие-то простые примитивные привязки но не к нику
просто делать сложные привязки нет смысла кто знает язык тот все все вскроет да и на 10-100 строк кода делать призявку на 1000 строк глупо ))
код без привязки хотыбы простой тоже незя
 

Стэнфорд

Потрачен
1,058
540
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Как узнать, находится ли нужный игрок за рулем?
 

Pu$$y

Участник
80
2
Lua:
lua_thread.create(function()
    print("Text")
    wait(1000) -- 1000ms = 1s
    print("Text 2")
end)
I tried this but my script is not working. I get crash:

local state = false
local sampev = require 'lib.samp.events'
local code

function main()
while not isSampAvailable() do wait(0) end wait(1)
sampRegisterChatCommand('armg', function()
state = not state
sampAddChatMessage(state and 'AutoReaction ON' or 'AutoReaction OFF', -1)
end)
wait(-1)
end

function sampev.onServerMessage(color, text)
if text:find('First one who types') then wait(1000)
code = text:match("First one who types (.+)")
lua_thread.create(function()
wait(1000) -- 1000ms = 1s
end)
sampAddChatMessage(code)
end
end

What am I doing wrong?
 

[w0te]

Потрачен
774
488
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
помогите пожалуйста, дайте пример как это включить в код на команду
 

Sanchez.

Известный
704
186
Как сделать обводку для кнопки имгуишки? Пробовал бордер - нихуя. Помогитии :333
 

[w0te]

Потрачен
774
488
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
помогите пожалуйста, как это сделать на команду, или это тоже из сингла?
 

Стэнфорд

Потрачен
1,058
540
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Помогите добавить в имгуи хоткей. Ряд вариантов шаблонов смотрел, постоянно что-то не дает работать скрипту
 

sep

Известный
672
76
как сделать чтобы скрипт работал правильно а не выключался если мой ник не первый
в файле несколько ников мой и другие

код:
local lock = getWorkingDirectory().."\\lock.txt"

name = sampGetPlayerNickname(select(2, sampGetPlayerIdByCharHandle(PLAYER_PED)))
for line in io.lines(lock) do
    if line ~= name then
sampAddChatMessage("ника нету скрипт не работает", 0x00ff00)
        --thisScript():unload()
else
sampAddChatMessage("скрипт работает", 0x00ff00)
    end
end
 

Dmitriy Makarov

25.05.2021
Проверенный
2,479
1,113
I tried this but my script is not working. I get crash:



What am I doing wrong?
Lua:
require 'lib.moonloader'
local sampev = require 'lib.samp.events'
local state = false

function main()
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand('armg', function()
        state = not state
        sampAddChatMessage(state and 'AutoReaction ON' or 'AutoReaction OFF', -1)
    end)
    wait(-1)
end

function sampev.onServerMessage(color, text)
    if text:find('First one who types') then
        lua_thread.create(function() wait(10)
            code = text:match("First one who types (.+)")
            wait(1000)
            sampAddChatMessage(code)
        end)
    end
end

как сделать чтобы скрипт работал правильно а не выключался если мой ник не первый
в файле несколько ников мой и другие

код:
local lock = getWorkingDirectory().."\\lock.txt"

name = sampGetPlayerNickname(select(2, sampGetPlayerIdByCharHandle(PLAYER_PED)))
for line in io.lines(lock) do
    if line ~= name then
sampAddChatMessage("ника нету скрипт не работает", 0x00ff00)
        --thisScript():unload()
else
sampAddChatMessage("скрипт работает", 0x00ff00)
    end
end
На форуме нашёл где-то.
Lua:
local lock = getWorkingDirectory().."\\lock.txt"

-- main
name = sampGetPlayerNickname(select(2, sampGetPlayerIdByCharHandle(PLAYER_PED)))
local function res()
    for line in io.lines(lock) do
        if name:find(line) then
            sampAddChatMessage("Ник есть", 0x00ff00)
            return true
        end
    end
    return false
end
if not res() then
    sampAddChatMessage("Ника нет", 0x00ff00)
end
 
Последнее редактирование:

abnomegd

Активный
335
35
Как такое сделать?
sa-mp-000.png