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

imring

Ride the Lightning
Всефорумный модератор
2,362
2,545
Что может обозначать ошибка, ниже написанная. По опкоду это sampAddChatMessage. В main, есть все проверки на загрузку всех необходим библиотек, то ошибка вылетает первой при заходе в игру.
Код:
opcode '0AF8' call caused an unhandled exception
код скинь.
 

AnWu

https://t.me/anwublog
Всефорумный модератор
4,768
5,370
Что может обозначать ошибка, ниже написанная. По опкоду это sampAddChatMessage. В main, есть все проверки на загрузку всех необходим библиотек, то ошибка вылетает первой при заходе в игру.
Код:
opcode '0AF8' call caused an unhandled exception
Дело в том что сначала нужно проверить на готовность сампа принимать какие-либо команды. Если ты вызваешь опкод, а самп еще не загрузился - скрипт выдет ошибку.
 

Hatiko

Известный
Проверенный
1,502
620
Lua:
function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isPlayerPlaying(PLAYER_HANDLE) do wait(100) end
    wait(1000)
    sampAddChatMessage("Проверка", -1)
    checkExistDir()
    if not doesDirectoryExist(dirml.."/moon/lib/samp/events") then return end
    checkExistEventFiles()
    wait(-1)
end
Там во функциях всякие проверки существования файлов их процесс скачивания, если их нет.
Что странно, после прогрузки экрана с логотипами игры, функции сразу выполняются, это видно, если не использовать функция sampAddChatMessage и в консоле видны все результаты кастомных функций.
 
Последнее редактирование:

samespoon

Известный
163
20
Написал вот такой "хелпер" для автозавода на DRP, но почему-то не пашет. Когда я занимаю рабочее место и соответственно появляется текст в чате, то игра зависает и приходится вырубать её через диспетчер задач. В чём дело?
Lua:
script_name("DRP / Helper for Car Factory")
script_authors("NoSoCheck")
script_version("0.1")
require "lib.moonloader"
local game_keys = require 'game.keys'
function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampAddChatMessage("{228B22}[Helper for Car Factory]", -1)
    while true do
    wait(0)
    text, prefix, color, pcolor = sampGetChatString(99)
    if text == "Вы заняли рабочее место, ожидайте прибытия автомобиля. Нажимайте и удерживайте пробел для выполнения работы." then
        space = 2
        wait(0)
        while space == 2 do
            setGameKeyState(game_keys.player.SPRINT, -1)
            sampAddChatMessage("{FF8C00}[CF HELP]: {228B22}Пробел нажимается.", -1)
        end
    end
    wait(0)
    if text == "Нажмите и удерживайте пробел для работы" then
        space = 2
        wait(0)
        while space == 2 do
            setGameKeyState(game_keys.player.SPRINT, -1)
            sampAddChatMessage("{FF8C00}[CF HELP]: Пробел {228B22}нажимается.", -1)
        end
    end
    wait(0)
        if text == "Кузов автомобиля собран" then
            s = s-1
        end
    wait(0)
        if s == 1 then
            sampAddChatMessage("{FF8C00}[CF HELP]: Пробел {800000}отжат.", -1)
        end
    end
end
 

AnWu

https://t.me/anwublog
Всефорумный модератор
4,768
5,370
Написал вот такой "хелпер" для автозавода на DRP, но почему-то не пашет. Когда я занимаю рабочее место и соответственно появляется текст в чате, то игра зависает и приходится вырубать её через диспетчер задач. В чём дело?
Lua:
script_name("DRP / Helper for Car Factory")
script_authors("NoSoCheck")
script_version("0.1")
require "lib.moonloader"
local game_keys = require 'game.keys'
function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampAddChatMessage("{228B22}[Helper for Car Factory]", -1)
    while true do
    wait(0)
    text, prefix, color, pcolor = sampGetChatString(99)
    if text == "Вы заняли рабочее место, ожидайте прибытия автомобиля. Нажимайте и удерживайте пробел для выполнения работы." then
        space = 2
        wait(0)
        while space == 2 do
            setGameKeyState(game_keys.player.SPRINT, -1)
            sampAddChatMessage("{FF8C00}[CF HELP]: {228B22}Пробел нажимается.", -1)
        end
    end
    wait(0)
    if text == "Нажмите и удерживайте пробел для работы" then
        space = 2
        wait(0)
        while space == 2 do
            setGameKeyState(game_keys.player.SPRINT, -1)
            sampAddChatMessage("{FF8C00}[CF HELP]: Пробел {228B22}нажимается.", -1)
        end
    end
    wait(0)
        if text == "Кузов автомобиля собран" then
            s = s-1
        end
    wait(0)
        if s == 1 then
            sampAddChatMessage("{FF8C00}[CF HELP]: Пробел {800000}отжат.", -1)
        end
    end
end
а почему у тебя wait(0) пихнут блять везде где ненадо. используй samp.lua
 

Hatiko

Известный
Проверенный
1,502
620
У меня такое чувство, что все эти функции не работают, они тупо игнрятся и идёт работа кастомных функций. Чё за херня?
Lua:
    if not isSampLoaded() or not isSampfuncsLoaded() then
        return
    end
    if not isPlayerPlaying(PLAYER_HANDLE) then return end
 

imring

Ride the Lightning
Всефорумный модератор
2,362
2,545
У меня такое чувство, что все эти функции не работают, они тупо игнрятся и идёт работа кастомных функций. Чё за херня?
Lua:
    if not isSampLoaded() or not isSampfuncsLoaded() then
        return
    end
    if not isPlayerPlaying(PLAYER_HANDLE) then return end
попробуй заменить на:
Lua:
while not isSampAvailable() and not sampIsLocalPlayerSpawned() do wait(0) end
 
  • Нравится
Реакции: Hatiko

Qsany

Потрачен
464
147
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Lua:
script_name("box")


function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then
        return
    end
        while not isSampAvailable do wait(100) end
    for textdrawid = 100, 1000 do
            if sampTextdrawIsExists(textdrawid) then
                local X, Y = sampTextdrawGetPos(textdrawid)
                    local box, color, sizeX, sizeY = sampTextdrawGetBoxEnabledColorAndSize(textdrawid)
                        sampTextdrawSetBoxColorAndSize(textdrawid, box, 0xFF00ff00, sizeX, sizeY)        -- 0xFF08598c

чет не могу закончить
 

Qsany

Потрачен
464
147
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Lua:
script_name("macros")

require 'lib.moonloader'
local vk = require 'lib.vkeys'

ModelCarIsVelo = {[481] = true, [509] = true, [510] = true}
ModelCarIsMoto = {[448] = true, [461] = true, [462] = true, [468] = true, [471] = true, [521] = true, [522] = true, [581] = true, [586] = true}

function main()
while not isSampAvailable() do wait(420) end
if not isSampfuncsLoaded() or not isSampLoaded() then return end
while true do
wait(0)
if isKeyJustPressed(vk.VK_F2) or testCheat("irun") then
InfRunState = not InfRunState
setPlayerNeverGetsTired(playerHandle, InfRunState)
if InfRunState then
printString("~B~run ~G~ON", 1337)
else
printString("~B~run ~R~OFF", 1337)
end
end
end
end
function main()
while not isSampAvailable() do wait(420) end
if not isSampfuncsLoaded() or not isSampLoaded() then return end
while true do
wait(0)
if isKeyJustPressed(VK_F3) then
BikeSH = not BikeSH
if BikeSH then printString("~G~ON", 1337) else printString("~R~OFF", 1337) end
end
if BikeSH and isKeyDown(VK_LSHIFT) and not sampIsChatInputActive() and not sampIsDialogActive() and isCharOnAnyBike(playerPed) then
if ModelCarIsVelo[getCarModel(storeCarCharIsInNoSave(playerPed))] then
setGameKeyState(16, 255)
wait(10)
setGameKeyState(16, 0)
elseif ModelCarIsMoto[getCarModel(storeCarCharIsInNoSave(playerPed))] then
setGameKeyState(1, -128)
wait(10)
setGameKeyState(1, 0)
end
end
end
end
end

В чем ошибка?
 

AnWu

https://t.me/anwublog
Всефорумный модератор
4,768
5,370
Lua:
script_name("macros")

require 'lib.moonloader'
local vk = require 'lib.vkeys'

ModelCarIsVelo = {[481] = true, [509] = true, [510] = true}
ModelCarIsMoto = {[448] = true, [461] = true, [462] = true, [468] = true, [471] = true, [521] = true, [522] = true, [581] = true, [586] = true}

function main()
while not isSampAvailable() do wait(420) end
if not isSampfuncsLoaded() or not isSampLoaded() then return end
while true do
wait(0)
if isKeyJustPressed(vk.VK_F2) or testCheat("irun") then
InfRunState = not InfRunState
setPlayerNeverGetsTired(playerHandle, InfRunState)
if InfRunState then
printString("~B~run ~G~ON", 1337)
else
printString("~B~run ~R~OFF", 1337)
end
end
end
end
function main()
while not isSampAvailable() do wait(420) end
if not isSampfuncsLoaded() or not isSampLoaded() then return end
while true do
wait(0)
if isKeyJustPressed(VK_F3) then
BikeSH = not BikeSH
if BikeSH then printString("~G~ON", 1337) else printString("~R~OFF", 1337) end
end
if BikeSH and isKeyDown(VK_LSHIFT) and not sampIsChatInputActive() and not sampIsDialogActive() and isCharOnAnyBike(playerPed) then
if ModelCarIsVelo[getCarModel(storeCarCharIsInNoSave(playerPed))] then
setGameKeyState(16, 255)
wait(10)
setGameKeyState(16, 0)
elseif ModelCarIsMoto[getCarModel(storeCarCharIsInNoSave(playerPed))] then
setGameKeyState(1, -128)
wait(10)
setGameKeyState(1, 0)
end
end
end
end
end

В чем ошибка?
В логике. У тебя смотри какая цеполчка:
Если клавиша нажата, но не зажата -> Если клавиша зажата
Раздели эти два условия. Активацию отдельно от исполняемого кода.
Подсказка: Нужно один end переместить над isKeyDown проверкой

А да блять. Почему у тебя 2 Main()???
 
  • Нравится
Реакции: Qsany

Qsany

Потрачен
464
147
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
В логике. У тебя смотри какая цеполчка:
Если клавиша нажата, но не зажата -> Если клавиша зажата
Раздели эти два условия. Активацию отдельно от исполняемого кода.
Подсказка: Нужно один end переместить над isKeyDown проверкой

А да блять. Почему у тебя 2 Main()???
чет у меня все равно, одно работает, а другое не