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

sat0ry

Известный
1,087
290
  • Вау
Реакции: ARMOR

dagestan

Новичок
13
0
Если уж да, то сделай так:
Lua:
require 'moonloader'

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end

    while true do
        wait(0)
        if sampGetDialogCaption():find('Бизнес') then
            sampSendDialogResponse(sampGetCurrentDialogId(), 1, nil, nil)
        end
    end
end
не-а, фигня какая-та. даже так не отвечает на диалоговое окно
 

Мuра

Новичок
8
1
не работает так, как должно. в часах и минутах должно указываться московское время. вроде всё правильно, но работает не правильно, не по мск времени
Lua:
        if tonumber(os.date("%H", os.time(utc) + 3 * 3600)) >= 19 and tonumber(os.date("%M")) >= 20 and tonumber(os.date("%H", os.time(utc) + 3 * 3600)) < 20 and tonumber(os.date("%M")) < 20 then
            sampAddChatMessage('{ffffe0}не вовремя', -1)
        end
 

vale0

Новичок
12
0
замени sampProcessChatInput('/piss') на sampSetSpecialAction(68)[/ICODE [/QUOTE] Пришлось переделать, но теперь он не вырубает анимку после того как отпускаю клавишу

require('lib.moonloader')
function main()
while not isSampAvailable() do wait(100) end

local active = false

while true do
wait(0)
if isKeyJustPressed(VK_R) and not sampIsChatInputActive() and not sampIsDialogActive() then
active = true
sampSetSpecialAction(68)
end
if wasKeyReleased(VK_R) and active then
active = false
lua_thread.create(function ()
setVirtualKeyDown(10, true)
wait(200)
setVirtualKeyDown(10, false)
end)
end
end
end
 

sat0ry

Известный
1,087
290
не работает так, как должно. в часах и минутах должно указываться московское время. вроде всё правильно, но работает не правильно, не по мск времени
Lua:
        if tonumber(os.date("%H", os.time(utc) + 3 * 3600)) >= 19 and tonumber(os.date("%M")) >= 20 and tonumber(os.date("%H", os.time(utc) + 3 * 3600)) < 20 and tonumber(os.date("%M")) < 20 then
            sampAddChatMessage('{ffffe0}не вовремя', -1)
        end
 
  • Нравится
Реакции: Мuра

chapo

🫡 В армии с 17.10.2023. В ЛС НЕ ОТВЕЧАЮ
Друг
8,776
11,228
Почему если использовать setAnimGroupForChar(playerPed, 'skate') для выдачи ходьбы роллера, то в чат летит дохуилиард варнингов и игра зависает?
п.с. на лаунчере арз почему то варнингов нет
п.с.2 с другими (man, woman и т.д. работают нормально)
 

shrug228

Активный
212
75
Если уж да, то сделай так:
Lua:
require 'moonloader'

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end

    while true do
        wait(0)
        if sampGetDialogCaption():find('Бизнес') then
            sampSendDialogResponse(sampGetCurrentDialogId(), 1, nil, nil)
        end
    end
end
Как ты будешь брать заголовок диалога, когда его нет? Где проверка на наличие диалога?
 

kizn

О КУ)))
Всефорумный модератор
2,405
2,060
Как ты будешь брать заголовок диалога, когда его нет? Где проверка на наличие диалога?
Нет, все будет работать, пока диалога нет sampGetDialogCaption вернет "", хотя проверку на наличие диалога лучше добавить
 

sat0ry

Известный
1,087
290
хотя проверку на наличие диалога лучше добавить
С этим польностью согласен, ибо оно будет проверять даже если нету диалога.

у меня так
Код:
eatSelect = ffi.new('const char *[7]', {u8'Картофель-Фри', u8'Сэндвич', u8'Бургер', u8'Крылышки', u8'Пицца', u8'Курица с салатом', u8'Комплексный Обед'}),

первые пару секунд нормально, а потом эта фигня

Все мои проблемы решились в одной теме.
 
Последнее редактирование:
  • Влюблен
Реакции: ik0nka

ik0nka

Известный
747
339
С этим польностью согласен, ибо оно будет проверять даже если нету диалога.



Все мои проблемы решились в одной теме.
Та я уже от чапы нашёл, но спасибо
 

Gorskin

{Reverse Developer} ✓
Проверенный
1,256
1,058

require('lib.moonloader')
function main()
while not isSampAvailable() do wait(100) end

local active = false

while true do
wait(0)
if isKeyJustPressed(VK_R) and not sampIsChatInputActive() and not sampIsDialogActive() then
active = true
sampSetSpecialAction(68)
end
if wasKeyReleased(VK_R) and active then
active = false
lua_thread.create(function ()
setVirtualKeyDown(10, true)
wait(200)
setVirtualKeyDown(10, false)
end)
end
end
end
Лучше уж так...
Lua:
        local proverka = false -- где-то перед main

        -- после while true do wait(0)
        if isKeyDown(VK_R) and sampGetPlayerSpecialAction(select(2, sampGetPlayerIdByCharHandle(PLAYER_PED))) ~= 68 and not sampIsCursorActive() and isCharOnFoot(PLAYER_PED) then
            sampSetSpecialAction(68)
            proverka = true
        elseif not isKeyDown(VK_R) and proverka and isCharOnFoot(PLAYER_PED) then
            sampSetSpecialAction(0)
            proverka = false
        end