Вопросы по 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,092
296
Приветствую, можно ли как то сделать обратный отсчет с помощью os.date?
 

Rice.

Известный
Модератор
1,754
1,620
Приветствую, в чем проблема?
Lua:
asyncHttpRequest('GET', 'https://api.vk.com/method/users.get', {params = {user_ids = '728895230', fields = 'bdate', access_token = 'ТОКЕН', v = '5.131'}},
function(response)
    print(response)
end,
function(err)
    print(err)
end)

--------------------------

function asyncHttpRequest(method, url, args, resolve, reject)
   local request_thread = effil.thread(function (method, url, args)
      local requests = require 'requests'
      local result, response = pcall(requests.request, method, url, args)
      if result then
         response.json, response.xml = nil, nil
         return true, response
      else
         return false, response
      end
   end)(method, url, args)
   -- Если запрос без функций обработки ответа и ошибок.
   if not resolve then resolve = function() end end
   if not reject then reject = function() end end
   -- Проверка выполнения потока
   lua_thread.create(function()
      local runner = request_thread
      while true do
         local status, err = runner:status()
         if not err then
            if status == 'completed' then
               local result, response = runner:get()
               if result then
                  resolve(response)
               else
                  reject(response)
               end
               return
            elseif status == 'canceled' then
               return reject(status)
            end
         else
            return reject(err)
         end
         wait(0)
      end
   end)
end
1652359119584.png
 

ewin

Известный
673
372
есть функция на подобии printStyledStringNow?
знаю только printStringNow
 

0x73616D

Активный
140
42
How can I get how far away I am from the 3dtext? | Как узнать, насколько далеко я от 3dtext?
 

Sergey_Turner

Участник
102
7
Приветствую. Есть такой код:
Code:
config: InputText=Text1||Text2||Text3

InputText.v = string.gsub(InputText.v, '||', '\n')
i = 0
for v in string.gmatch(InputText.v, '[^\r\n]+') do
    i = i + 1
    text = InputText.v
    string = string.format("{FFFFFF}%d) %s", i, text)
    imgui.Text(string)
end
Он выводит:
Вывод:
1) Text1
Text2
Text3
2) Text1
Text2
Text3
3) Text1
Text2
Text3
А необходимо:
Необходимо:
1) Text1
2) Text2
3) Text3
Как это можно реализовать?
 

chapo

чопа сребдс // @moujeek
Модератор
8,873
11,588
Приветствую. Есть такой код:
Code:
config: InputText=Text1||Text2||Text3

InputText.v = string.gsub(InputText.v, '||', '\n')
i = 0
for v in string.gmatch(InputText.v, '[^\r\n]+') do
    i = i + 1
    text = InputText.v
    string = string.format("{FFFFFF}%d) %s", i, text)
    imgui.Text(string)
end
Он выводит:
Вывод:
1) Text1
Text2
Text3
2) Text1
Text2
Text3
3) Text1
Text2
Text3
А необходимо:
Необходимо:
1) Text1
2) Text2
3) Text3
Как это можно реализовать?
замени text на v
1652436018652.png
 
  • Нравится
Реакции: Sergey_Turner

shrug228

Активный
212
75
How can I get how far away I am from the 3dtext? | Как узнать, насколько далеко я от 3dtext?
Lua:
function getDistanceInWorld3D(pedX, pedY, pedZ, posX, posY, posZ)
    pedX,pedY,pedZ = getCharCoordinates(playerPed)
    distance= math.sqrt( ((posX-pedX)^2) + ((posY-pedY)^2) + ((posZ-pedZ)^2))
    return distance
end

local result = getDistanceInWorld3D(getCharCoordinates(PLAYER_PED)--[[, 3dtext coordinates]])
I have taken this function from this message.

Lua:
printStringNow('~r~Hello world!') -- выведет красный текст
есть функция на подобии printStyledStringNow?
знаю только printStringNow
Lua:
printStringNow('~r~ Hello ~g~world!', 3000) -- выведет красный текст

Приветствую, в чем проблема?
Lua:
asyncHttpRequest('GET', 'https://api.vk.com/method/users.get', {params = {user_ids = '728895230', fields = 'bdate', access_token = 'ТОКЕН', v = '5.131'}},
function(response)
    print(response)
end,
function(err)
    print(err)
end)

--------------------------

function asyncHttpRequest(method, url, args, resolve, reject)
   local request_thread = effil.thread(function (method, url, args)
      local requests = require 'requests'
      local result, response = pcall(requests.request, method, url, args)
      if result then
         response.json, response.xml = nil, nil
         return true, response
      else
         return false, response
      end
   end)(method, url, args)
   -- Если запрос без функций обработки ответа и ошибок.
   if not resolve then resolve = function() end end
   if not reject then reject = function() end end
   -- Проверка выполнения потока
   lua_thread.create(function()
      local runner = request_thread
      while true do
         local status, err = runner:status()
         if not err then
            if status == 'completed' then
               local result, response = runner:get()
               if result then
                  resolve(response)
               else
                  reject(response)
               end
               return
            elseif status == 'canceled' then
               return reject(status)
            end
         else
            return reject(err)
         end
         wait(0)
      end
   end)
end
Посмотреть вложение 147751
Могу посоветовать попробовать: а) использовать строковые ключи для таблиц (пример ниже); б) составить запрос вручную.
Lua:
t = {
    ['test'] = 1,
    ['test2'] = 2
}
 
Последнее редактирование:
  • Нравится
Реакции: 0x73616D

wqaddfs0

Потрачен
12
36
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Есть вот такой код:
Lua:
if imgui.BeginPopupModal(u8'test') then
    imgui.Text(u8'Привет!')
    imgui.EndPopup()
end
Как сделать так, чтобы нельзя было изменить размер Popup'a в мимгуи?
 

ch1ps

Участник
101
3
как получить анимку стана, которая сейчас проигрывается и сбить её?
onApplyPlayerAnimation не вариант, ибо она получает лишь анимки от сервера, а
sampGetPlayerAnimationId отправляет 0
 

moreveal

Известный
Проверенный
925
624
Сколько раз не пытался узнать как сделать, чтобы HTTP запросы не фризили игру - кидали ссылку на асинхронные. Я испробовал обе функции (и с requests, и без) - безрезультатно, каждый запрос происходит фриз, длиной в секунду. Есть вообще возможность отправлять запросы без зависаний, если требуется получить ответ от сервера?
Lua:
local response = httpRequest("POST", {"https://random-site.com", data = data, headers = headers})
assert(response.status_code == 200, "Не установлено соединение с сервером")
local result = decodeJson(response.text)

-- используемая функция
local copas = require 'copas'
local http = require 'copas.http'
local requests = require 'requests'
requests.http_socket, requests.https_socket = http, http
function httpRequest(method, request, args, handler) -- lua-requests
    -- start polling task
    if not copas.running then
        copas.running = true
        lua_thread.create(function()
            wait(0)
            while not copas.finished() do
                local ok, err = copas.step(0)
                if ok == nil then error(err) end
                wait(0)
            end
            copas.running = false
        end)
    end
    -- do request
    if handler then
        return copas.addthread(function(m, r, a, h)
            copas.setErrorHandler(function(err) h(nil, err) end)
            h(requests.request(m, r, a))
        end, method, request, args, handler)
    else
        local results
        local thread = copas.addthread(function(m, r, a)
            copas.setErrorHandler(function(err) results = {nil, err} end)
            results = table.pack(requests.request(m, r, a))
        end, method, request, args)
        while coroutine.status(thread) ~= 'dead' do wait(0) end
        return table.unpack(results)
    end
end
 

Rice.

Известный
Модератор
1,754
1,620
Сколько раз не пытался узнать как сделать, чтобы HTTP запросы не фризили игру - кидали ссылку на асинхронные. Я испробовал обе функции (и с requests, и без) - безрезультатно, каждый запрос происходит фриз, длиной в секунду. Есть вообще возможность отправлять запросы без зависаний, если требуется получить ответ от сервера?
Lua:
local response = httpRequest("POST", {"https://random-site.com", data = data, headers = headers})
assert(response.status_code == 200, "Не установлено соединение с сервером")
local result = decodeJson(response.text)

-- используемая функция
local copas = require 'copas'
local http = require 'copas.http'
local requests = require 'requests'
requests.http_socket, requests.https_socket = http, http
function httpRequest(method, request, args, handler) -- lua-requests
    -- start polling task
    if not copas.running then
        copas.running = true
        lua_thread.create(function()
            wait(0)
            while not copas.finished() do
                local ok, err = copas.step(0)
                if ok == nil then error(err) end
                wait(0)
            end
            copas.running = false
        end)
    end
    -- do request
    if handler then
        return copas.addthread(function(m, r, a, h)
            copas.setErrorHandler(function(err) h(nil, err) end)
            h(requests.request(m, r, a))
        end, method, request, args, handler)
    else
        local results
        local thread = copas.addthread(function(m, r, a)
            copas.setErrorHandler(function(err) results = {nil, err} end)
            results = table.pack(requests.request(m, r, a))
        end, method, request, args)
        while coroutine.status(thread) ~= 'dead' do wait(0) end
        return table.unpack(results)
    end
end
без зависаний - https://www.blast.hk/threads/20532/page-3#post-256096
 
  • Нравится
Реакции: moreveal

Dmitriy Makarov

25.05.2021
Проверенный
2,500
1,132
Ох, я не уверен, но это окошко вроде имеет почти те же флаги, что и обычное имгуи окно, могу ошибаться. 1 раз доводилось с этим работать, но уже забыл.
Попробуй вот так:
Lua:
if imgui.BeginPopupModal(u8'test', imgui.WindowFlags.NoResize) then
    imgui.Text(u8'Привет!')
    imgui.EndPopup()
end
 
  • Нравится
Реакции: wqaddfs0