Вопросы по 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.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

Pears Project — уже запущен!
Всефорумный модератор
2,651
2,554
теперь только время чёрное, это можно как-то убрать?
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

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

CaJlaT

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

siwage

Активный
191
67
Как получить свой 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

Известный
673
372
effil.table: 0E8EE9B4

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

ewin

Известный
673
372
Можешь показать код где запрос? Ссылку можешь убрать, если палить не хочешь
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
 

siwage

Активный
191
67
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
Попробуй


code:
function(response)
    if response.status_code == 200 then
        local text = u8:decode(response.text)
        print(text)
    end
end
 
  • Нравится
Реакции: ewin

ewin

Известный
673
372
Попробуй


code:
function(response)
    if response.status_code == 200 then
        local text = u8:decode(response.text)
        print(text)
    end
end
effil.table: 2A887584

Попробуй


code:
function(response)
    if response.status_code == 200 then
        local text = u8:decode(response.text)
        print(text)
    end
end
а хотя мне и status_code хватит, благодарю
 

RaMero

Известный
436
125
Здравствуйте, можно ли получить модель объекта по текстдравы? Объясняю: Есть текстдрав оружия(АК-47), как мне получить модель объекта, через этот текстдрав? Возможно есть какие-то другие способы? Хукать айди мне этого текстдрава не нужно, через какое-то событие этот текстдрав заменяется на другое оружие
 
D

deleted-user-139653

Гость
Шо не так, бо я не понимаю этот ебаный mimgui, а хочется изучать по-немногу
Ошибка:
Lua:
bad argument #3 to 'InputTextMultiline' (cannot convert 'struct ImVec2' to 'unsigned int')
Код:

Lua:
local inicfg = require("inicfg")
local hook = require("samp.events")
local imgui = require("mimgui")

local encoding = require("encoding")
encoding.default = 'CP1251'
local u8 = encoding.UTF8

local ini = inicfg.load({
    Nicknames = {}
}, "Angar.ini")

local window_state = imgui.new.bool()
local buffer = imgui.new.char[512]((ini.Nicknames))

function main()
    repeat wait(0) until isSampAvailable()
    sampRegisterChatCommand("angar", function()
        window_state[0] = not window_state[0]
    end)
    wait(-1)
end

imgui.OnFrame(function() return window_state[0] end, function(player)
    local sw, sh = getScreenResolution()
    imgui.SetNextWindowSize(imgui.ImVec2(320, 390))
    imgui.SetNextWindowPos(imgui.ImVec2(sw / 2, sh / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
    imgui.Begin(u8'Помощник для Ангара', window_state, imgui.WindowFlags.AlwaysAutoResize)
    imgui.Text(u8('Список ников:'))
   
    if imgui.InputTextMultiline('##team', buffer, imgui.ImVec2(-1, -1)) then
        ini.Nicknames = {}
        for line in string.gmatch(u8:decode(buffer[0]), '[^\r\n]+') do
            table.insert(ini.Nicknames, line)
        end
    end

    if imgui.Button(u8('Сохранить настройка'), imgui.ImVec2(300,30)) then
        if inicfg.save(ini, 'moonloader\\config\\Angar.ini') then
            sampAddChatMessage('{FB4343}[Помощник для Ангара]{FFFFFF}: Настройки успешно сохранены.', 0xFFFFFF)
        else
            sampAddChatMessage('{FB4343}[Помощник для Ангара]{FFFFFF}: Настройки не хотят сохранятся, ничего не могу поделать :(', 0xFFFFFF)
        end
    end

    imgui.End()
end)
 

pugovkin228

Участник
33
2
Шо не так, бо я не понимаю этот ебаный mimgui, а хочется изучать по-немногу
Ошибка:
Lua:
bad argument #3 to 'InputTextMultiline' (cannot convert 'struct ImVec2' to 'unsigned int')
Код:

Lua:
local inicfg = require("inicfg")
local hook = require("samp.events")
local imgui = require("mimgui")

local encoding = require("encoding")
encoding.default = 'CP1251'
local u8 = encoding.UTF8

local ini = inicfg.load({
    Nicknames = {}
}, "Angar.ini")

local window_state = imgui.new.bool()
local buffer = imgui.new.char[512]((ini.Nicknames))

function main()
    repeat wait(0) until isSampAvailable()
    sampRegisterChatCommand("angar", function()
        window_state[0] = not window_state[0]
    end)
    wait(-1)
end

imgui.OnFrame(function() return window_state[0] end, function(player)
    local sw, sh = getScreenResolution()
    imgui.SetNextWindowSize(imgui.ImVec2(320, 390))
    imgui.SetNextWindowPos(imgui.ImVec2(sw / 2, sh / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
    imgui.Begin(u8'Помощник для Ангара', window_state, imgui.WindowFlags.AlwaysAutoResize)
    imgui.Text(u8('Список ников:'))
 
    if imgui.InputTextMultiline('##team', buffer, imgui.ImVec2(-1, -1)) then
        ini.Nicknames = {}
        for line in string.gmatch(u8:decode(buffer[0]), '[^\r\n]+') do
            table.insert(ini.Nicknames, line)
        end
    end

    if imgui.Button(u8('Сохранить настройка'), imgui.ImVec2(300,30)) then
        if inicfg.save(ini, 'moonloader\\config\\Angar.ini') then
            sampAddChatMessage('{FB4343}[Помощник для Ангара]{FFFFFF}: Настройки успешно сохранены.', 0xFFFFFF)
        else
            sampAddChatMessage('{FB4343}[Помощник для Ангара]{FFFFFF}: Настройки не хотят сохранятся, ничего не могу поделать :(', 0xFFFFFF)
        end
    end

    imgui.End()
end)
А -1, -1 что делает? Окно скрипта под разрешение монитора подстраивает? По-моему и без этого аргумента подстраивается.
Замени на:
Код:
    if imgui.InputTextMultiline('##team', buffer, imgui.ImVec2) then
upd: Да и вообще третий аргумент должен быть указан в численном значении, которое указывает максимальное кол-во символов для ввода, так правильнее будет:
Код:
imgui.InputTextMultiline('##team', buffer, 512) then


sa-mp-019.png
 
Последнее редактирование: