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

Alkasch226

Известный
43
4
Только начал разбираться в LUA и MoonLoader.
Не могу понять, как сделать сохранение из imgui.InputTextMultiline в подобном формате:
image.png
Если сохранять, никак не форматируя текст, выходит что-то подобное:
image.png

Скорее всего нужно использовать string.format, но у меня ничего не вышло.
Хотелось бы увидеть пример, как объединить весь текст в одну строку.
Lua:
imgui = require 'imgui'
samp = require 'samp.events'
encoding = require 'encoding'
key = require "vkeys"
local inicfg = require 'inicfg'
require "lib.sampfuncs"
require "lib.moonloader"
encoding.default = 'CP1251'
u8 = encoding.UTF8

if not doesFileExist('moonloader\\config\\TT\\setting.ini') then
    if not doesDirectoryExist('moonloader\\config\\TT') then
        createDirectory('moonloader\\config\\TT')
    end
local    ini = {
        settings = {
            user_InputTextMultiline = test
        }
    }
    inicfg.save(ini, 'TT\\setting')
end
local ini = inicfg.load(nil, 'TT\\setting')

active_rcom = imgui.ImBool(false)

user_InputTextMultiline = imgui.ImBuffer(tostring(ini.settings.user_InputTextMultiline), 256)

function imgui.OnDrawFrame()
    local x, y = getScreenResolution()
    if active_rcom.v then
      imgui.LockPlayer = true
      imgui.SetNextWindowPos(imgui.ImVec2(x/2, y/2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
      imgui.SetNextWindowSize(imgui.ImVec2(900, 500), imgui.Cond.FirstUseEver)
      imgui.Begin(u8('Настройки'), active_rcom)
      imgui.BeginChild('left pane', imgui.ImVec2(135, 0), true)
      if not selected then selected = 1 end
      if imgui.Selectable(u8('test1'), false) then selected = 1 end
      if imgui.Selectable(u8('test2'), false) then selected = 2 end
      if imgui.Selectable(u8('test3'), false) then selected = 3 end
      imgui.EndChild()
      imgui.SameLine();
      imgui.BeginGroup()
      if selected == 1 then
        imgui.Text(u8'Настройка текста')
        imgui.Separator()
        imgui.PushItemWidth(80)
        --btn_size = imgui.ImVec2(100, 20)
        --imgui.SetCursorPos(imgui.ImVec2(170, 172))
        imgui.InputTextMultiline('', user_InputTextMultiline, imgui.ImVec2(-0.1, -0.1))
        ini.settings.user_InputTextMultiline = user_InputTextMultiline.v
        inicfg.save(ini, 'TT\\setting')
      end
      if selected == 2 then end
            if selected == 3 then end
      -- ...
      imgui.EndGroup()
      imgui.End()
    end
end

function main()
  while true do wait(0)
    if isKeyJustPressed(VK_7) then
      active_rcom.v = not active_rcom.v end
    imgui.Process = active_rcom.v end
end
 
Последнее редактирование:

Vlad Horii

Известный
Проверенный
310
171
Только начал разбираться в LUA и MoonLoader.
Не могу понять, как сделать сохранение из imgui.InputTextMultiline в подобном формате:
image.png
Если сохранять, никак не форматируя текст, выходит что-то подобное:
image.png

Скорее всего нужно использовать string.format, но у меня ничего не вышло.
Хотелось бы увидеть пример, как объединить весь текст в одну строку.
Ты свой код скинь который получился, а мы исправим ошибки уже.
 
  • Нравится
Реакции: AnWu

imring

Ride the Lightning
Всефорумный модератор
2,353
2,512
Как узнать название кнопки диалога?
 

mirapi

Участник
51
3
У одного человека возникла проблема с LuaSocket. Самостоятельно не смог решить проблему.
Код:
error loading module 'socket.core' from file 'C:\Program Files\GTA San Andreas (N-torrents.ru)\moonloader\lib\socket\core.dll':
Не найдена указанная процедура.

С файлами библиотеки все в порядке. При использовании выходит такая ошибка и скрипт завершает работу.
В самом коде вызова socket думаю ошибки нет. Встретилась только у одного пользователя.
К этому вопросу. В общем некоторыми тестами мне удалось понять, что LuaSocket не работает на Win XP (а пользователи такие есть, лол).
Как можно определить версию OS? Знаю что делается это посредством ffi, но не смог вытащить этот параметр.
 

Hatiko

Известный
Проверенный
1,469
610
Можно ли как-то получить коорды инпута чата или какую-то привязку точно не знаю. В чём суть, требуется при открытии чата под интуп окном была строчка, к примеру "BlastHack". Что-то подобное слео ChatHud.
 

hnnssy

Известный
Друг
2,684
2,744
Можно ли как-то получить коорды инпута чата или какую-то привязку точно не знаю. В чём суть, требуется при открытии чата под интуп окном была строчка, к примеру "BlastHack". Что-то подобное слео ChatHud.
попробуй
Lua:
local pos_X = getStructElement(sampGetInputInfoPtr(), 8, 4, false)
local pos_Y = getStructElement(sampGetInputInfoPtr(), 12, 4, false)
 

AnWu

Guardian of Order
Всефорумный модератор
4,683
5,128
Можно ли как-то получить коорды инпута чата или какую-то привязку точно не знаю. В чём суть, требуется при открытии чата под интуп окном была строчка, к примеру "BlastHack". Что-то подобное слео ChatHud.
inputhelper чекай
 

Hatiko

Известный
Проверенный
1,469
610
попробуй
Lua:
local pos_X = getStructElement(sampGetInputInfoPtr(), 8, 4, false)
local pos_Y = getStructElement(sampGetInputInfoPtr(), 12, 4, false)
Я попробовал сделать, но мне что-то возвращает в эти переменные такие значения: pos_X = 77856056, pos_Y = 62213488. При изменении количества строк, значения не меняются.

Если ты имеешь в виду про cleo, там опкод коорды даёт сразу.
 

CAPTA!N

Новичок
220
48
Короче тема такая. Есть пикап, точнее такая херня тип звездочка, которая работает по типу пикапа перед шлагбаумом. Ты на него наезжаешь - твою машину останавливает на любой скорости в момент, а так же вылазит диалог в котором предлагается заплатить проезд в другой город. Оплачиваешь - пропускает, нет - ну на нет и суда нет. Я хочу сделать так что бы при активации скрипта, вываливался этот диалог, или ваще сразу оплата за проезд что б была, и при проезде через шлагбаум машину не останавливало. Пока что я использую как костыль диалог хайдер. Подьезжаю, беру этот пикап, прячу диалог, и когда нужно открываю. Но остановка машины на полной скорости все же есть. Кто подскажет как реализовать данный скрипт, потому что идей у меня ваще нет.
 

drags

Известный
Проверенный
155
207
Можно ли как то получить текст текстдравов на фейковых координатах?
Пример:
Отправил фейк коорд
Получил все тестдравы на той позиции
 

itsLegend

Фонд борьбы за жуков 🐞
Администратор
2,695
1,447
Я попробовал сделать, но мне что-то возвращает в эти переменные такие значения: pos_X = 77856056, pos_Y = 62213488. При изменении количества строк, значения не меняются.
После получения значения из getStructElement используй lua - representintasfloat | BlastHack — DEV_WIKI(https://blast.hk/wiki/lua:representintasfloat)
 

Hatiko

Известный
Проверенный
1,469
610
Получил из этой функции дробные значения, 3.8553660532234e-36 1.0656002653026e-36, при изменении количества строк в чате, для изменения положения инпута, значения те же остаются, статичные.
Может адрес неправильный ведён?
Lua:
local pos_X = getStructElement(sampGetInputInfoPtr(), 8, 4, false)
local pos_Y = getStructElement(sampGetInputInfoPtr(), 12, 4, false)