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

Eugene Crabs

Активный
544
30
Оба способа не работают. Если что - вот мой код.
Lua:
function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    while not isSampAvailable() do wait(100) end
    if isKeyDown(17) and isKeyDown(84) then
        while isKeyDown(17) and isKeyDown(84) do wait(80) end
        local veh = getAllVehicles()
        for i = 1, #veh do sampAddChatMessage(i, veh[i]) end
    end
    wait(-1)
end

Lua:
print(#getAllVehicles())
Тоже самое, к сожалению.
 

VEN1LOV

Новичок
9
10
Оба способа не работают. Если что - вот мой код.
Lua:
function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    while not isSampAvailable() do wait(100) end
    if isKeyDown(17) and isKeyDown(84) then
        while isKeyDown(17) and isKeyDown(84) do wait(80) end
        local veh = getAllVehicles()
        for i = 1, #veh do sampAddChatMessage(i, veh[i]) end
    end
    wait(-1)
end


Тоже самое, к сожалению.
Засунуть код в бесконечный цикл для слабаков же, наверное?
Lua:
function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    while not isSampAvailable() do wait(100) end
    while true do
        wait(0)
        if isKeyDown(17) and isKeyDown(84) then
            while isKeyDown(17) and isKeyDown(84) do wait(80) end
            local veh = getAllVehicles()
            for i = 1, #veh do sampAddChatMessage(("%d - %d"):format(i, veh[i]), -1) end
        end
    end
end
 
  • Нравится
Реакции: Eugene Crabs

Domino

Участник
326
15
Как сделать, чтобы убирался не последний 3д текст, а весь, который был установлен.
Lua:
function main()
  if not isSampfuncsLoaded() or not isSampLoaded() then return end
  while not isSampAvailable() do wait(100) end
  sampRegisterChatCommand("3dtext", text)
  sampRegisterChatCommand("3doff", tex)
  wait(-1)
end

function tex()
    if idof then
        sampDestroy3dText(idof)
        idof = nil
    end
end

function text(arg)
    if tonumber(arg) and not idof then
        local a = "{ff7500}В{ffeb00}р{9cff00}а{27ff00}г"
        id = tonumber(arg)
        sampAddChatMessage("Игрок с id "..id.. " помечен как "..a, -1)
        idof = sampCreate3dText(a, 0xFF3399FF, 0.0, 0.0, -0.5, 21, false, id, -1)
    end
end
 

Eugene Crabs

Активный
544
30
Засунуть код в бесконечный цикл для слабаков же, наверное?
Lua:
function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    while not isSampAvailable() do wait(100) end
    while true do
        wait(0)
        if isKeyDown(17) and isKeyDown(84) then
            while isKeyDown(17) and isKeyDown(84) do wait(80) end
            local veh = getAllVehicles()
            for i = 1, #veh do sampAddChatMessage(("%d - %d"):format(i, veh[i]), -1) end
        end
    end
end
Ни на что не повлияло
 

VEN1LOV

Новичок
9
10
Как сделать, чтобы убирался не последний 3д текст, а весь, который был установлен.
Для того, чтоб хранить все созданные 3D тексты, можно использовать массивы.
Lua:
local p = { }

function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand("3dtext", text)
    sampRegisterChatCommand("3doff", tex)
    wait(-1)
end

function tex()
    if #p > 0 then
        for k, v in pairs(p) do
            sampDestroy3dText(v); p[k] = nil;
        end
        sampAddChatMessage("Список был очищен.", -1);
    end
end

function text(arg)
    local i = tonumber(arg);
    if i ~= nil and not p[i] then
        local a = "{ff7500}В{ffeb00}р{9cff00}а{27ff00}г";
        p[i] = sampCreate3dText(a, 0xFF3399FF, 0.0, 0.0, -0.5, 21, false, i, -1);
        sampAddChatMessage("Игрок с id "..i.. " помечен как "..a, -1);
    end
end

Ни на что не повлияло
Велика вероятность, что ты особенный. MoonLoader.Log молчит по этому поводу?
 
  • Нравится
Реакции: Eugene Crabs

ШPEK

Известный
1,476
524
Как сделать, чтобы убирался не последний 3д текст, а весь, который был установлен.
Lua:
function main()
  if not isSampfuncsLoaded() or not isSampLoaded() then return end
  while not isSampAvailable() do wait(100) end
  sampRegisterChatCommand("3dtext", text)
  sampRegisterChatCommand("3doff", tex)
  wait(-1)
end

function tex()
    if idof then
        sampDestroy3dText(idof)
        idof = nil
    end
end

function text(arg)
    if tonumber(arg) and not idof then
        local a = "{ff7500}В{ffeb00}р{9cff00}а{27ff00}г"
        id = tonumber(arg)
        sampAddChatMessage("Игрок с id "..id.. " помечен как "..a, -1)
        idof = sampCreate3dText(a, 0xFF3399FF, 0.0, 0.0, -0.5, 21, false, id, -1)
    end
end
Lua:
local texts = {}

function main()
  if not isSampfuncsLoaded() or not isSampLoaded() then return end
  while not isSampAvailable() do wait(100) end
  sampRegisterChatCommand("3dtext", text)
  sampRegisterChatCommand("3doff", tex)
  wait(-1)
end

function tex()
    if #texts > 0 then
        for _, v in ipairs(texts) do
        	sampDestroy3dText(v)
        end
        texts = {}
    end
end

function text(arg)
    if tonumber(arg) then
        local a = "{ff7500}В{ffeb00}р{9cff00}а{27ff00}г"
        id = tonumber(arg)
        sampAddChatMessage("Игрок с id "..id.. " помечен как "..a, -1)
        table.insert(texts, sampCreate3dText(a, 0xFF3399FF, 0.0, 0.0, -0.5, 21, false, id, -1))
    end
end
 

Fomikus

Известный
Проверенный
472
341
Как красиво рисовать в данном случае ВХ?
Lua:
                            local posX, posY, posZ = getCharCoordinates(cped)
                            X, Y = convert3DCoordsToScreen(posX, posY, posZ)
                            renderFontDrawText(font, sampGetPlayerNickname(i)..'['..i..']', X, Y, 0xFFBEBEBE)
Чтобы оно было на 1 месте и не плавало при изменении расстояния в данном случае игрока.
 
  • Нравится
Реакции: Receiver

ШPEK

Известный
1,476
524
Как красиво рисовать в данном случае ВХ?
Lua:
                            local posX, posY, posZ = getCharCoordinates(cped)
                            X, Y = convert3DCoordsToScreen(posX, posY, posZ)
                            renderFontDrawText(font, sampGetPlayerNickname(i)..'['..i..']', X, Y, 0xFFBEBEBE)
Чтобы оно было на 1 месте и не плавало при изменении расстояния в данном случае игрока.
Никак
 

Eugene Crabs

Активный
544
30
Для того, чтоб хранить все созданные 3D тексты, можно использовать массивы.
Lua:
local p = { }

function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand("3dtext", text)
    sampRegisterChatCommand("3doff", tex)
    wait(-1)
end

function tex()
    if #p > 0 then
        for k, v in pairs(p) do
            sampDestroy3dText(v); p[k] = nil;
        end
        sampAddChatMessage("Список был очищен.", -1);
    end
end

function text(arg)
    local i = tonumber(arg);
    if i ~= nil and not p[i] then
        local a = "{ff7500}В{ffeb00}р{9cff00}а{27ff00}г";
        p[i] = sampCreate3dText(a, 0xFF3399FF, 0.0, 0.0, -0.5, 21, false, i, -1);
        sampAddChatMessage("Игрок с id "..i.. " помечен как "..a, -1);
    end
end


Велика вероятность, что ты особенный. MoonLoader.Log молчит по этому поводу?
Насколько я знаю - да. Лови лог.

[16:04:34.621185] (system) Session started.
[16:04:34.622185] (debug) Module handle: 62E30000.

MoonLoader v.015-alpha loaded.
Developers: FYP, hnnssy, EvgeN 1137

© BlastHack Team, 2016
https://www.blast.hk

[16:04:34.622185] (info) Working directory: "C:\Program Files (x86)\GTA San Andreas MultiPlayer\moonloader"
[16:04:34.622185] (debug) FP Control: 9001f
[16:04:34.622185] (system) Installing pre-game hooks... OK.
[16:04:36.977319] (debug) Initializing opcode handler table
[16:04:36.977319] (debug) package.path = .\?.lua;C:\Program Files (x86)\GTA San Andreas MultiPlayer\moonloader\lib\?.lua;C:\Program Files (x86)\GTA San Andreas MultiPlayer\moonloader\lib\?\init.lua;C:\Program Files (x86)\GTA San Andreas MultiPlayer\moonloader\?.lua;C:\Program Files (x86)\GTA San Andreas MultiPlayer\moonloader\?\init.lua
[16:04:36.977319] (debug) package.cpath = .\?.dll;C:\Program Files (x86)\GTA San Andreas MultiPlayer\moonloader\lib\?.dll;C:\Program Files (x86)\GTA San Andreas MultiPlayer\moonloader\?.dll
[16:04:36.977319] (system) Loading script 'C:\Program Files (x86)\GTA San Andreas MultiPlayer\moonloader\reload_all.lua'...
[16:04:36.977319] (debug) New thread: 0793C1FC
[16:04:36.978320] (system) ML-ReloadAll: Loaded successfully.
[16:04:36.978320] (system) Loading script 'C:\Program Files (x86)\GTA San Andreas MultiPlayer\moonloader\Первое.lua'...
[16:04:36.978320] (debug) New thread: 0793C3A4
[16:04:36.979320] (system) Первое.lua: Loaded successfully.
[16:04:43.818711] (system) Installing post-load hooks... OK.
Ребят, посмотрите еще это. Я пока в логе не особо разбираюсь, может вам это что-то скажет. Обновлял в игре с помощью "reload all".

[16:12:24.560064] (system) Session started.
[16:12:24.560064] (debug) Module handle: 62E30000.

MoonLoader v.015-alpha loaded.
Developers: FYP, hnnssy, EvgeN 1137

© BlastHack Team, 2016
https://www.blast.hk

[16:12:24.560064] (info) Working directory: "C:\Program Files (x86)\GTA San Andreas MultiPlayer\moonloader"
[16:12:24.560064] (debug) FP Control: 9001f
[16:12:24.560064] (system) Installing pre-game hooks... OK.
[16:12:27.188214] (debug) Initializing opcode handler table
[16:12:27.188214] (debug) package.path = .\?.lua;C:\Program Files (x86)\GTA San Andreas MultiPlayer\moonloader\lib\?.lua;C:\Program Files (x86)\GTA San Andreas MultiPlayer\moonloader\lib\?\init.lua;C:\Program Files (x86)\GTA San Andreas MultiPlayer\moonloader\?.lua;C:\Program Files (x86)\GTA San Andreas MultiPlayer\moonloader\?\init.lua
[16:12:27.188214] (debug) package.cpath = .\?.dll;C:\Program Files (x86)\GTA San Andreas MultiPlayer\moonloader\lib\?.dll;C:\Program Files (x86)\GTA San Andreas MultiPlayer\moonloader\?.dll
[16:12:27.188214] (system) Loading script 'C:\Program Files (x86)\GTA San Andreas MultiPlayer\moonloader\reload_all.lua'...
[16:12:27.188214] (debug) New thread: 077B0A54
[16:12:27.190214] (system) ML-ReloadAll: Loaded successfully.
[16:12:27.190214] (system) Loading script 'C:\Program Files (x86)\GTA San Andreas MultiPlayer\moonloader\Первое.lua'...
[16:12:27.190214] (debug) New thread: 077B0BFC
[16:12:27.191214] (system) Первое.lua: Loaded successfully.
[16:12:34.073608] (system) Installing post-load hooks... OK.
[16:12:51.527606] (error) ... (x86)\GTA San Andreas MultiPlayer\moonloader\Первое.lua:12: attempt to call global 'getAllVehicles' (a nil value)
[16:12:51.527606] (error) Первое.lua: Thread died due to an error (077B0BFC)
[16:12:51.582609] (system) ML-ReloadAll: Thread terminated (077B0A54)
[16:12:51.583609] (system) Loading script 'C:\Program Files (x86)\GTA San Andreas MultiPlayer\moonloader\reload_all.lua'...
[16:12:51.583609] (debug) New thread: 15A991FC
[16:12:51.584609] (system) ML-ReloadAll: Loaded successfully.
[16:12:51.584609] (system) Loading script 'C:\Program Files (x86)\GTA San Andreas MultiPlayer\moonloader\Первое.lua'...
[16:12:51.584609] (debug) New thread: 15A993A4
[16:12:51.585609] (system) Первое.lua: Loaded successfully.
[16:12:52.574666] (error) ... (x86)\GTA San Andreas MultiPlayer\moonloader\Первое.lua:12: attempt to call global 'getAllVehicles' (a nil value)
[16:12:52.574666] (error) Первое.lua: Thread died due to an error (15A993A4)
[16:12:52.594667] (system) ML-ReloadAll: Thread terminated (15A991FC)
[16:12:52.595667] (system) Loading script 'C:\Program Files (x86)\GTA San Andreas MultiPlayer\moonloader\reload_all.lua'...
[16:12:52.595667] (debug) New thread: 15A991FC
[16:12:52.596667] (system) ML-ReloadAll: Loaded successfully.
[16:12:52.596667] (system) Loading script 'C:\Program Files (x86)\GTA San Andreas MultiPlayer\moonloader\Первое.lua'...
[16:12:52.596667] (debug) New thread: 15A993A4
[16:12:52.597667] (system) Первое.lua: Loaded successfully.
[16:12:53.651728] (error) ... (x86)\GTA San Andreas MultiPlayer\moonloader\Первое.lua:12: attempt to call global 'getAllVehicles' (a nil value)
[16:12:53.651728] (error) Первое.lua: Thread died due to an error (15A993A4)
[16:12:53.671729] (system) ML-ReloadAll: Thread terminated (15A991FC)
[16:12:53.672729] (system) Loading script 'C:\Program Files (x86)\GTA San Andreas MultiPlayer\moonloader\reload_all.lua'...
[16:12:53.672729] (debug) New thread: 15A991FC
[16:12:53.673729] (system) ML-ReloadAll: Loaded successfully.
[16:12:53.673729] (system) Loading script 'C:\Program Files (x86)\GTA San Andreas MultiPlayer\moonloader\Первое.lua'...
[16:12:53.673729] (debug) New thread: 15A993A4
[16:12:53.674729] (system) Первое.lua: Loaded successfully.
[16:12:57.571952] (error) ... (x86)\GTA San Andreas MultiPlayer\moonloader\Первое.lua:12: attempt to call global 'getAllVehicles' (a nil value)
[16:12:57.571952] (error) Первое.lua: Thread died due to an error (15A993A4)
[16:12:57.617954] (system) ML-ReloadAll: Thread terminated (15A991FC)
[16:12:57.617954] (system) Loading script 'C:\Program Files (x86)\GTA San Andreas MultiPlayer\moonloader\reload_all.lua'...
[16:12:57.617954] (debug) New thread: 15A991FC
[16:12:57.618955] (system) ML-ReloadAll: Loaded successfully.
[16:12:57.618955] (system) Loading script 'C:\Program Files (x86)\GTA San Andreas MultiPlayer\moonloader\Первое.lua'...
[16:12:57.618955] (debug) New thread: 15A993A4
[16:12:57.619955] (system) Первое.lua: Loaded successfully.
[16:12:58.585010] (error) ... (x86)\GTA San Andreas MultiPlayer\moonloader\Первое.lua:12: attempt to call global 'getAllVehicles' (a nil value)
[16:12:58.585010] (error) Первое.lua: Thread died due to an error (15A993A4)
[16:12:58.609011] (system) ML-ReloadAll: Thread terminated (15A991FC)
[16:12:58.609011] (system) Loading script 'C:\Program Files (x86)\GTA San Andreas MultiPlayer\moonloader\reload_all.lua'...
[16:12:58.609011] (debug) New thread: 15A991FC
[16:12:58.610011] (system) ML-ReloadAll: Loaded successfully.
[16:12:58.611011] (system) Loading script 'C:\Program Files (x86)\GTA San Andreas MultiPlayer\moonloader\Первое.lua'...
[16:12:58.611011] (debug) New thread: 15A993A4
[16:12:58.611011] (system) Первое.lua: Loaded successfully.
 
Последнее редактирование:

VEN1LOV

Новичок
9
10
Насколько я знаю - да. Лови лог.

[16:04:34.621185] (system) Session started.
[16:04:34.622185] (debug) Module handle: 62E30000.

MoonLoader v.015-alpha loaded.
Developers: FYP, hnnssy, EvgeN 1137

© BlastHack Team, 2016
https://www.blast.hk

[16:04:34.622185] (info) Working directory: "C:\Program Files (x86)\GTA San Andreas MultiPlayer\moonloader"
[16:04:34.622185] (debug) FP Control: 9001f
[16:04:34.622185] (system) Installing pre-game hooks... OK.
[16:04:36.977319] (debug) Initializing opcode handler table
[16:04:36.977319] (debug) package.path = .\?.lua;C:\Program Files (x86)\GTA San Andreas MultiPlayer\moonloader\lib\?.lua;C:\Program Files (x86)\GTA San Andreas MultiPlayer\moonloader\lib\?\init.lua;C:\Program Files (x86)\GTA San Andreas MultiPlayer\moonloader\?.lua;C:\Program Files (x86)\GTA San Andreas MultiPlayer\moonloader\?\init.lua
[16:04:36.977319] (debug) package.cpath = .\?.dll;C:\Program Files (x86)\GTA San Andreas MultiPlayer\moonloader\lib\?.dll;C:\Program Files (x86)\GTA San Andreas MultiPlayer\moonloader\?.dll
[16:04:36.977319] (system) Loading script 'C:\Program Files (x86)\GTA San Andreas MultiPlayer\moonloader\reload_all.lua'...
[16:04:36.977319] (debug) New thread: 0793C1FC
[16:04:36.978320] (system) ML-ReloadAll: Loaded successfully.
[16:04:36.978320] (system) Loading script 'C:\Program Files (x86)\GTA San Andreas MultiPlayer\moonloader\Первое.lua'...
[16:04:36.978320] (debug) New thread: 0793C3A4
[16:04:36.979320] (system) Первое.lua: Loaded successfully.
[16:04:43.818711] (system) Installing post-load hooks... OK.
Обнови MoonLoader с v.015-alpha до самой последней версии, что сейчас есть. Возможно, проблема состоит в этом.
 
  • Нравится
Реакции: Eugene Crabs

Eugene Crabs

Активный
544
30
Обнови MoonLoader с v.015-alpha до самой последней версии, что сейчас есть. Возможно, проблема состоит в этом.
Так тупо я себя еще никогда не чувствовал... Спасибо. Если не сложно - на досуге скинь SAMPFUNCKS и ASI Loader, самые новые.
 

VEN1LOV

Новичок
9
10
  • Нравится
Реакции: Eugene Crabs

VEN1LOV

Новичок
9
10
И да, что такое "Хэндл" транспортных средств или чего либо?
В GTA handle - особое число, идентификатор, который указывает на какую-либо определённую ячейку в памяти игры, будь то объект, пикап, персонаж или транспортное средство. Зная handle игрока, например, можно узнать, какое оружие у него в руках, сколько у него жизней и так далее. В общем, норм тема.
Помню, в Sanny Builder был хороший справочник, в котором была собрана почти вся информация по GTA'шке. Правда мало кто будет ставить целую программу лишь из-за справки.
 
  • Нравится
Реакции: Eugene Crabs