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

Corrygan228

Участник
132
9
почему была обычная иконка в imgui.Text, но когда я поменял на imgui.TextColoredRGB, то появилась какая-то херабора?
Lua:
imgui.BeginChild('##style_changer', imgui.ImVec2(45, 80), true)
    imgui.TextColoredRGB('{33CCFF}' .. fa.ICON_MOON_O .. u8'')
    imgui.Separator()
    imgui.Text(fa.ICON_SUN_O .. u8'')
imgui.EndChild()


1688756328926.png
 

Corrygan228

Участник
132
9
Почему цвет текста чёрный?
Lua:
local white_color == "{FFFFFF}"

--фрейм
if imgui.Button(fa.ICON_FLOPPY_O, imgui.ImVec2(38, 36)) then
    sampAddChatMessage('[Prison Helper]:' .. white_color .. ' Все данные были успешно сохранены!', 0x0099FF)
    iniSave()
end


1688813727352.png
 

ChromiusJ

Известный
Друг
4,900
3,189
Почему цвет текста чёрный?
Lua:
local white_color == "{FFFFFF}"

--фрейм
if imgui.Button(fa.ICON_FLOPPY_O, imgui.ImVec2(38, 36)) then
    sampAddChatMessage('[Prison Helper]:' .. white_color .. ' Все данные были успешно сохранены!', 0x0099FF)
    iniSave()
end


Посмотреть вложение 207312
перед тегом скрипта напиши какой нибудь цвет
 
  • Bug
Реакции: Rice.

Corrygan228

Участник
132
9
перед тегом скрипта напиши какой нибудь цвет
теперь только время чёрное, это можно как-то убрать?
Lua:
if imgui.Button(fa.ICON_FLOPPY_O, imgui.ImVec2(38, 36)) then
    sampAddChatMessage('{0099FF}[Prison Helper]:' .. white_color .. ' Все данные были успешно сохранены!', 0x0099FF)
    iniSave()
end
1688815200693.png
 

ChromiusJ

Известный
Друг
4,900
3,189
теперь только время чёрное, это можно как-то убрать?
Lua:
if imgui.Button(fa.ICON_FLOPPY_O, imgui.ImVec2(38, 36)) then
    sampAddChatMessage('{0099FF}[Prison Helper]:' .. white_color .. ' Все данные были успешно сохранены!', 0x0099FF)
    iniSave()
end
Посмотреть вложение 207316
Lua:
sampAddChatMessage('{0099FF}[Prison Helper]:' .. white_color .. ' Все данные были успешно сохранены!', -1)
 
  • Нравится
Реакции: Corrygan228

Corrygan228

Участник
132
9
Из-за чего попап теряет фон? Как убрать фигню, для уменьшения размера, если у меня присутствует imgui.WindowFlags.NoResize?

Lua:
if imgui.Button(fa.ICON_TRASH_O, imgui.ImVec2(38, 36)) then
    imgui.OpenPopup('##reset_confirm')
end

if imgui.BeginPopupModal('##reset_confirm', imgui.WindowFlags.NoResize) then
    imgui.SetNextWindowSize(imgui.ImVec2(350, 150))
    imgui.CenterText(u8'Вы уверены, что хотите сбросить настройки?')
    imgui.NewLine()
    imgui.SetCursorPosX(37)
    if imgui.Button(u8'Да', imgui.ImVec2(120, 50)) then
        iniReset()
    end
    imgui.SameLine()
    imgui.SetCursorPosX(194)
    if imgui.Button(u8'Нет', imgui.ImVec2(120, 50)) then
        imgui.CloseCurrentPopup()
    end
    imgui.EndPopup()
end
1688817661313.png
1688817751308.png
 

#Northn

Police Helper «Reborn» — уже ШЕСТЬ лет!
Всефорумный модератор
2,634
2,484
теперь только время чёрное, это можно как-то убрать?
Lua:
if imgui.Button(fa.ICON_FLOPPY_O, imgui.ImVec2(38, 36)) then
    sampAddChatMessage('{0099FF}[Prison Helper]:' .. white_color .. ' Все данные были успешно сохранены!', 0x0099FF)
    iniSave()
end
Посмотреть вложение 207316
сделай
0x0099FF % 0x1000000

и не слушай этот совет:
перед тегом скрипта напиши какой нибудь цвет
ибо это плохая практика
 
  • Нравится
  • Клоун
Реакции: Fott, CaJlaT и ChromiusJ

hahabog

Новичок
27
8
Возможно ли сделать функцию, которая берет информацию из диалогов ого окна и дублирует в чат(Например: /leaders показывает лидеров в диалоговом окне, а мне нужно продублировать Ники должности номера и т.д. в чат и в последующем закрыть диалог)?
 

CaJlaT

Овощ
Модератор
2,805
2,607
как получить координаты радара (центра)?
Возможно ли сделать функцию, которая берет информацию из диалогов ого окна и дублирует в чат(Например: /leaders показывает лидеров в диалоговом окне, а мне нужно продублировать Ники должности номера и т.д. в чат и в последующем закрыть диалог)?
Да, возможно
 
  • Нравится
Реакции: Мира

siwage

Активный
188
65
Как получить свой IP?

code:
require('lib.moonloader')
local effil = require 'effil'
local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8

function main()
    while not isSampAvailable() do wait(0) end
        sampRegisterChatCommand("ip",getMyIp)
    while true do
        wait(0)
        
    end
end

function getMyIp()
    asyncHttpRequest('GET', 'https://api.myip.com/', nil --[[Аргументы запроса]],
    function(response)
        if response.status_code == 200 then
            local text = u8:decode(response.text)
            local ip = text:match("(%d+%.%d+%.%d+%.%d+)")
            sampAddChatMessage('Your ip > ' .. ip, -1)

        end
    end,
    function(err)
       print(err)
    end) 
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
 
  • Влюблен
Реакции: Yans

ewin

Известный
675
369
effil.table: 0E8EE9B4

как эту таблицу прочитать можно?
получить все значения в ней
 

ewin

Известный
675
369
Можешь показать код где запрос? Ссылку можешь убрать, если палить не хочешь
Lua:
asyncHttpRequesting('GET', "LINK", {headers = {['content-type'] = 'application/json'}, data = u8(encodeJson(data))},
function(response)
    print(tostring(response))
end,
function(err)
    print('Ошибка:'..err)
end)

function asyncHttpRequesting(method, urlchat, args, resolve, reject)
    local request_thread = effil.thread(function(method, urlds, args)
      local requests = require"requests"
      local result, response = pcall(requests.request, method, urlchat, args)
      if result then
        response.json, response.xml = nil, nil
        return true, response
      else
        return false, response
      end
    end)(method, urlchat, 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()
            print(response)
            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