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

Tranzit

Известный
269
154
Народ, в function main() у меня такой код:

Lua:
    while true do
        wait(0)
        sampRegisterChatCommand('test22', dialog_open)
    end

но при этом в консоли sampfuncs флудит

RegisterCommand Error: Command "test22" already exists.
но без while true do команда отказывается работать.
В бесконечном цикле регистрировать команду? Ну это бред...
Код:
if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
и после этого регай команду
 
  • Нравится
Реакции: skarzer999

mails2k18

Участник
45
0
Приветствую форумчане, подскажите пожалуйста, как возможно убрать черту в нике (при отыгровке), если ник автоматически берётся из ID ?
Lua:
local name = sampGetPlayerNickname(id) -- Получения ника по ID
sampSendChat('Приветствую, я сотрудник полиции '..mainIni.raciya.gorod..' '..name..'')
По данному коду в чате (уже в самой фразе) пишет "James_Mails", а мне нужно убрать именно это подчёркивание, чтобы результат был такой "James Mails"
 

Izvinisb

Известный
Проверенный
964
598
Приветствую форумчане, подскажите пожалуйста, как возможно убрать черту в нике (при отыгровке), если ник автоматически берётся из ID ?
Lua:
local name = sampGetPlayerNickname(id) -- Получения ника по ID
sampSendChat('Приветствую, я сотрудник полиции '..mainIni.raciya.gorod..' '..name..'')
По данному коду в чате (уже в самой фразе) пишет "James_Mails", а мне нужно убрать именно это подчёркивание, чтобы результат был такой "James Mails"
local name = sampGetPlayerNickname(id):gsub('_', ' ')
 
  • Нравится
Реакции: mails2k18

skarzer999

Известный
24
2
Народ,начал потихоньку изучать луа,и столкнулся с проблемой,в коде ниже не работает команда по открытию диалога,когда делал через бесконечный цикл то работало,знаю что так нельзя,но когда ставил команду после проверка на загрузку SAMP то перестаёт работать. Заранее спасибо.
Lua:
script_name('RP Helper')
script_author('skarzer')

require "lib.moonloader"

local tag = "{f2ba49}[Helper]:"

function main()
    if not isSampLoaded() or not isSampfuncsLoaded () then return end
    while not isSampAvailable() do wait(100) end
    
    sampRegisterChatCommand('helper', cmd_1)
    
    sampAddChatMessage(tag .." {FFFFFF}Успешно загружен",0xFFFFFF)

end

function cmd_1()

    sampShowDialog(100002, tag.. ' {ffffff} О скрипте', '{FFFFFF}ля ля тополя.','Закрыть','',0)
end
 

_delete_

Потрачен
122
78
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Народ,начал потихоньку изучать луа,и столкнулся с проблемой,в коде ниже не работает команда по открытию диалога,когда делал через бесконечный цикл то работало,знаю что так нельзя,но когда ставил команду после проверка на загрузку SAMP то перестаёт работать. Заранее спасибо.
Lua:
script_name('RP Helper')
script_author('skarzer')

require "lib.moonloader"

local tag = "{f2ba49}[Helper]:"

function main()
    if not isSampLoaded() or not isSampfuncsLoaded () then return end
    while not isSampAvailable() do wait(100) end
  
    sampRegisterChatCommand('helper', cmd_1)
  
    sampAddChatMessage(tag .." {FFFFFF}Успешно загружен",0xFFFFFF)

end

function cmd_1()

    sampShowDialog(100002, tag.. ' {ffffff} О скрипте', '{FFFFFF}ля ля тополя.','Закрыть','',0)
end
Lua:
script_name('RP Helper')
script_author('skarzer')

require "lib.moonloader"

local tag = "{f2ba49}[Helper]:"

function main()
    if not isSampLoaded() or not isSampfuncsLoaded () then return end
    while not isSampAvailable() do wait(100) end
   
    sampRegisterChatCommand('helper', cmd_1)
   
    sampAddChatMessage(tag .." {FFFFFF}Успешно загружен",0xFFFFFF)
    while true do
    wait(0)
    if a then sampShowDialog(100002, tag.. ' {ffffff} О скрипте', '{FFFFFF}ля ля тополя.','Закрыть','',0) end

end

function cmd_1()
a = not a
end
Попробуй так. Может быть что то не так так как писал с телефона.
 
Последнее редактирование:

CaJlaT

Овощ
Модератор
2,805
2,606
есть строка X1 | (.+) | X3
X3 может меняться (не зависит от юзера, со стороны сервера), при смене X3 скрипт перестает функционировать, как сделать так, чтобы при написании любого текста скрипт игнорировал то, что там написано?
X1 | (.+) | .+
 
  • Нравится
Реакции: Basho

andrey_hacker

Известный
274
88
Народ,начал потихоньку изучать луа,и столкнулся с проблемой,в коде ниже не работает команда по открытию диалога,когда делал через бесконечный цикл то работало,знаю что так нельзя,но когда ставил команду после проверка на загрузку SAMP то перестаёт работать. Заранее спасибо.
Lua:
script_name('RP Helper')
script_author('skarzer')

require "lib.moonloader"

local tag = "{f2ba49}[Helper]:"

function main()
    if not isSampLoaded() or not isSampfuncsLoaded () then return end
    while not isSampAvailable() do wait(100) end
   
    sampRegisterChatCommand('helper', cmd_1)
   
    sampAddChatMessage(tag .." {FFFFFF}Успешно загружен",0xFFFFFF)

end

function cmd_1()

    sampShowDialog(100002, tag.. ' {ffffff} О скрипте', '{FFFFFF}ля ля тополя.','Закрыть','',0)
end
после sampAddChatMessage поставь wait(-1)
 

Rei

Известный
Друг
1,589
1,618
Как сделать условие по тексту итема(!), например, "Донат" и кликнуть по нему?
 

Вложения

  • 1589231496732.png
    1589231496732.png
    14.2 KB · Просмотры: 89

Dmitriy Makarov

25.05.2021
Проверенный
2,478
1,113
Как сделать условие по тексту итема(!), например, "Донат" и кликнуть по нему?
Тут только поиск текста (самое главное)
 

beshbarmak

Новичок
7
2
Вот я сделал скрипт на отключение худа, но на команду. Хочется что бы он активировался на кнопку \, помогите это сделать. Вот код
Lua:
script_author("Nishikinov")
local memory = require 'memory'

function main()
    if not isSampLoaded() then return end
    while not isSampAvailable() do wait(0) end
    sampRegisterChatCommand("/hud", function(chat)
        radar = memory.getint32(0xBA676C)
        if radar > 0 then
            memory.setint32(0xBA676C, 0)
        else
            memory.setint32(0xBA676C, 2)
        end
        hud = memory.getint8(0xA444A0)
        if hud > 0 then
            displayHud(false)
        else
            displayHud(true)
        end
        end)
    sampRegisterChatCommand("mypagesize", function(chat)
        local id = chat:match("%d+")
        print(memory.getint8(0x21A0E4, true))
    end)
    sampRegisterChatCommand("testmessage", function(chat)
        sampAddChatMessage("1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111", -1)
    end)
    while true do
        wait(0)
    end
end
 

Rei

Известный
Друг
1,589
1,618
Тут только поиск текста (самое главное)

сплитануть текст диалога по \n и искать донат
ебусь почти час, так и не смог ничего рабочего приколдовать, попробовав 3 предложенных решений
 

Just/Do/It

Известный
3
0
Приветствую.
Каким образом можно реализовать вывод команды "/lock" при условии, если чат закрыт?

Попытался через isInChat()=0, Но выдаёт ошибку expected near '='
Lua:
if (isInChat()=0) and isKeyJustPressed(VK_L) then
        sampSendChat("/lock")
            end

В луа не смыслю, хотел написать простейший бинд.
Заранее спасибо.
 

McLore

Известный
559
279
Приветствую.
Каким образом можно реализовать вывод команды "/lock" при условии, если чат закрыт?

Попытался через isInChat()=0, Но выдаёт ошибку expected near '='
Lua:
if (isInChat()=0) and isKeyJustPressed(VK_L) then
        sampSendChat("/lock")
            end

В луа не смыслю, хотел написать простейший бинд.
Заранее спасибо.
Мемные проверки ты делаешь)
Код:
if not sampIsChatInputActive() and isKeyJustPressed(VK_L) then
    sampSendChat("/lock")
end
 
  • Нравится
Реакции: Just/Do/It