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

m1racles

Активный
199
32
Lua:
function sliv()
    active = not active
    lua_thread.create(function()
        for i = 50, 400 do
            sampSendChat("Привет")
            wait(300)
        end
    end)
end
function sampev.onServerMessage(color, text)
    if active and text:find('Перед отправкой следующего сообщения в чат следует подождать') then
        return false
    end
end
когда прописана команда, onServerMessage работает, после повторного ввода все прекращается, но флуд из sliv() продолжается
как исправить?
 

qdIbp

Автор темы
Проверенный
1,387
1,143
Lua:
function sliv()
    active = not active
    lua_thread.create(function()
        for i = 50, 400 do
            sampSendChat("Привет")
            wait(300)
        end
    end)
end
function sampev.onServerMessage(color, text)
    if active and text:find('Перед отправкой следующего сообщения в чат следует подождать') then
        return false
    end
end
когда прописана команда, onServerMessage работает, после повторного ввода все прекращается, но флуд из sliv() продолжается
как исправить?
Может потому что
sliv() active = not active
Ты бы больше кода скинул
 

linmsqn

Участник
337
9
Lua:
local text = renderCreateFont("Arial", 10, 12)
require 'lib.moonloader'

function main()
    while not isSampAvailable() do wait(0) end

    while true do
        wait(0)
           sampTextdrawCreate(text,"HEllo",70,320,0xff00ff, 0xff00ff)
    end
end
how to output the value from .ini there?

и как еще допустим вписать туда значение из конфига? типо мне нужно чтобы было
'text '..и тут из конфига чет
 
Последнее редактирование:

meowprd

Тот самый Котовский
Проверенный
1,280
712
Lua:
local text = renderCreateFont("Arial", 10, 12)
require 'lib.moonloader'

function main()
    while not isSampAvailable() do wait(0) end

    while true do
        wait(0)
           sampTextdrawCreate(text,"HEllo",70,320,0xff00ff, 0xff00ff)
    end
end
Насколько помнится текстдравы нужно создавать вне бесконечного цикла иначе их будет слишком много
 

Alver

Участник
132
7
Как сделать скрипт который по иду обьекта будет искать его в стриме что-то по типу рендера аризоны
 

meowprd

Тот самый Котовский
Проверенный
1,280
712
Lua:
function sliv()
    active = not active
    lua_thread.create(function()
        for i = 50, 400 do
            sampSendChat("Привет")
            wait(300)
        end
    end)
end
function sampev.onServerMessage(color, text)
    if active and text:find('Перед отправкой следующего сообщения в чат следует подождать') then
        return false
    end
end
когда прописана команда, onServerMessage работает, после повторного ввода все прекращается, но флуд из sliv() продолжается
как исправить?
Проверку в цикле сделай на переменную

Как сделать скрипт который по иду обьекта будет искать его в стриме что-то по типу рендера аризоны
В моих темах посмотри mushroomMap, по примеру можешь сделать
 

linmsqn

Участник
337
9
как в рендер текст вывести значение из конфига? типо у меня выводится текст сам, но мне нужно чтобы показывалось еще значение из конфига
 

Alver

Участник
132
7
Проверку в цикле сделай на переменную


В моих темах посмотри mushroomMap, по примеру можешь сделать
открыл и не понял честно почти нечего название скрипта автор то что нужно для работы и дальше мне более не понятные строки прийдеться разобраться в луа потому что я походу в лесу
 

S7XA

Активный
109
67
Что не так? Нужно что-бы после text:find выполнить действия SetCursorPos
Code:
require "lib.moonloader"
local sampev = require 'lib.samp.events'
local vkeys = require 'vkeys'
local game_keys = require 'game.keys'
local ffi = require("ffi")

function main()
  if not isSampLoaded() or not isSampfuncsLoaded() then return end
  while not isSampAvailable() do wait(100) end
  sampRegisterChatCommand("test", cmd_test)
  wait(-1)
end




ffi.cdef[[
bool SetCursorPos(int X, int Y);
]]

function cmd_test()
    lua_thread.create(function()
    if text:find('mister') then
         ffi.C.SetCursorPos(969, 734)
 wait(5)
         setVirtualKeyDown(1, true)
 wait(15)
         setVirtualKeyDown(1, false)
 wait(5)
         ffi.C.SetCursorPos(960, 641)
 wait(3)
         ffi.C.SetCursorPos(596, 471)
    end
end)
end

moonloader.log:
[20:19:22.979898] (error)    sss.lua: ...op\Mirik sbk BARD v4.2 Among US\gtacr\moonloader\sss.lua:23: attempt to index global 'text' (a nil value)
stack traceback:
    ...op\Mirik sbk BARD v4.2 Among US\gtacr\moonloader\sss.lua: in function <...op\Mirik sbk BARD v4.2 Among US\gtacr\moonloader\sss.lua:22>
stack traceback:
    [C]: in function 'create'
    ...op\Mirik sbk BARD v4.2 Among US\gtacr\moonloader\sss.lua:22: in function <...op\Mirik sbk BARD v4.2 Among US\gtacr\moonloader\sss.lua:21>
[20:19:22.981786] (error)    sss.lua: Script died due to an error. (19CD59DC)
 

MHS Team

Потрачен
34
3
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Как сделать произведение звука при определённом событие?