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

Hatiko

Известный
Проверенный
1,471
612
Помогите пожалуйста разобраться с функцией inicfg.load(), в описании её не совсем понял как с ней работать. Приведите пожалуйста пример с готовым конфиком хранящийся в папке config>NameScript>set.ini:
INI:
[setting]
set1=50
set2=20
И ещё, функцию inicfg.save кидать в цикл или как?
 

imring

Ride the Lightning
Всефорумный модератор
2,355
2,518
Помогите пожалуйста разобраться с функцией inicfg.load(), в описании её не совсем понял как с ней работать. Приведите пожалуйста пример с готовым конфиком:
INI:
[setting]
set1=50
set2=20
И ещё, функцию inicfg.save кидать в цикл или как?
Lua:
local file = inicfg.load(nil, --[[файл]])
file.setting.set1 = 75
file.setting.set2 = file.setting.set1 - 5
inicfg.save(file, --[[файл]])

В файле будет:
INI:
[setting]
set1=75
set2=70
 

AnWu

Guardian of Order
Всефорумный модератор
4,689
5,203
Помогите пожалуйста разобраться с функцией inicfg.load(), в описании её не совсем понял как с ней работать. Приведите пожалуйста пример с готовым конфиком хранящийся в папке config>NameScript>set.ini:
INI:
[setting]
set1=50
set2=20
И ещё, функцию inicfg.save кидать в цикл или как?
можно не не приветствуется. лучше сохранять при действиях. при изменении данных
 

Bogach

Активный
558
27
Lua:
float distance = getDistanceBetweenCoords3d(float x1, float y1, float z1, float x2, float y2, float z2)  -- 050A

Пример:
Lua:
local result, handle = getCharPlayerIsTargeting(playerHandle)
if result then
    local mx, my, mz = getCharCoordinates(playerPed)
    local x, y, z = getCharCoordinates(handle)
    local distance = getDistanceBetweenCoords3d(mx, my, mz, x, y, z)
    -- ...
end


Lua:
local file = io.open(..., 'r')
local text, t = file:read('*a'), {}
for w in text:gmatch('[^\r\n]+') do
    t[#t+1] = w
end
-- Первая строка: t[1] ; Последняя строка: t[#t]
-- ...
Стоп. Не обратил особого внимания на первую функцию getCharPlayerIsTargeting. А если мне надо узнать handle игрока не целясь в него, когда он в зоне стрима?
 

imring

Ride the Lightning
Всефорумный модератор
2,355
2,518
Стоп. Не обратил особого внимания на первую функцию getCharPlayerIsTargeting. А если мне надо узнать handle игрока не целясь в него, когда он в зоне стрима?
Lua:
for i = 0, sampGetMaxPlayerId(true) do
    local result, handle = sampGetCharHandleBySampPlayerId(i)
    if result then
        local mx, my, mz = getCharCoordinates(playerPed)
        local x, y, z = getCharCoordinates(handle)
        local distance = getDistanceBetweenCoords3d(mx, my, mz, x, y, z)
        -- ...
    end
end
 
  • Нравится
Реакции: Alkasch226 и Bogach

Bogach

Активный
558
27
Lua:
if autoexam == 2 then
        print(TimeExams,ASexamGO)
        if TimeExams == 0 and ASexamGO == 1 then
                for i = 0, sampGetMaxPlayerId(true) do
                      if sampIsPlayerConnected(i) then
                            local playername = sampGetPlayerNickname(i)
                            if ekzamen2 ~= nil then
                                    if string.find(playername,ekzamen2) then
                                        result, handle = sampGetCharHandleBySampPlayerId(i)
                                        break
                                end
                          end
                        end
              end
                if result and doesCharExist(handle) then
                    local mx, my, mz = getCharCoordinates(playerPed)
                    local x, y, z = getCharCoordinates(handle)
                    local distance = getDistanceBetweenCoords3d(mx, my, mz, x, y, z)
                    print(distance)
                    if distance < 3 then
                            sampSendChat('/exam')
                    end
                    autoexam = 1
                end
        end
Что не так ?
 
Последнее редактирование:

AnWu

Guardian of Order
Всефорумный модератор
4,689
5,203
Lua:
if autoexam == 2 then
        print(TimeExams,ASexamGO)
        if TimeExams == 0 and ASexamGO == 1 then
                for i = 0, sampGetMaxPlayerId(true) do
                      if sampIsPlayerConnected(i) then
                            local playername = sampGetPlayerNickname(i)
                            if ekzamen2 ~= nil then
                                    if string.find(playername,ekzamen2) then
                                        result, handle = sampGetCharHandleBySampPlayerId(i)
                                        break
                                end
                          end
                        end
              end
                if result and doesCharExist(handle) then
                    local mx, my, mz = getCharCoordinates(playerPed)
                    local x, y, z = getCharCoordinates(handle)
                    local distance = getDistanceBetweenCoords3d(mx, my, mz, x, y, z)
                    print(distance)
                    if distance < 3 then
                            sampSendChat('/exam')
                    end
                    autoexam = 1
                end
        end
Что не так ?
какая ошибка? или тупо не работает? опиши что должно делать
 

MrCold

Активный
364
118
Есть такой опкод, чтобы например если сделать ImGui на клавишу H, открыть чат и нажать H не активировался ImGui. Ну или просто Lua скрипт, чтобы при открытом чате не мог активироваться на клавишу
 

imring

Ride the Lightning
Всефорумный модератор
2,355
2,518
Есть такой опкод, чтобы например если сделать ImGui на клавишу H, открыть чат и нажать H не активировался ImGui. Ну или просто Lua скрипт, чтобы при открытом чате не мог активироваться на клавишу
Lua:
if not sampIsChatInputActive() and not sampIsDialogActive() and not sampIsScoreboardOpen() and not isSampfuncsConsoleActive() then
    if isKeyJustPressed(0x48) then edit_menu_time_weather.v = not edit_menu_time_weather.v end
end
поменяй edit_menu_time_weather на своё
 

Bogach

Активный
558
27
какая ошибка? или тупо не работает? опиши что должно делать
Скрипт по сути должен вводить команду /exam, если я нахожусь рядом с игроком.
Цикл идет, но вроде как я понял совпадение никнеймов нет, через пару секунд (примерно) работы скрипт, он падает
выдает обычные две ошибки которые всегда выдаются при падении скрипта. Нет ошибки которая указывают на определенную строку в которой находится ошибка
 

imring

Ride the Lightning
Всефорумный модератор
2,355
2,518
киньте пример как использовать renderDrawTexture, я просто криворукий и у меня не появляется текстура
Lua:
name = renderLoadTextureFromFile(--[[Файл]])
while true do wait(0)
    -- ...
    renderDrawTexture(name, 40, 40, 95, 95, 0.0, -1)
    -- ...
end
 
  • Нравится
Реакции: #kerosin

MrCold

Активный
364
118
Хочу сделать Lua, чтобы например: команда /server (IP сервера и порт). Как это сделать?