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

Дядя Энрик.

Активный
321
75
подскажите пожалуйста, как можно убрать драв в гуи чтоб туда передавались только значения?
сказали использовать text:gsub , но оно передаёт полностью весь драв вместо определённого. Нужно убрать ~w~_ эту шляпу в гуи и передавать только %d+.%d+ m / %d+.%d+
Код:
if data.text:find('HP~w~_(%d+).(%d+)') or data.text:find('HP~w~_(%d+).(%d+)_m_/_(%d+).(%d+)_r') then
        hpspec = data.text:match('%d+.%d+_m_/_%d+.%d+_r') or data.text:match('~w~_%d+.%d+_m_/_%d+.%d+_r')
        end
 
Последнее редактирование:

auf.exe

Участник
41
12
как удалить кусок списка на примере
Луа:
imgui.BeginChild('Delete', imgui.ImVec2(250, 400), true)
        imgui.Combo('test', combo_test2, decodedJson["places"], decodedJson[#"places"])
        if imgui.Button(u8"Удалить место", imgui.ImVec2(250,20)) then
            table.remove(decodedJson["places"][combo_test2.v + 1])
            table.remove(decodedJson["placesX"][combo_test2.v + 1])
            table.remove(decodedJson["placesY"][combo_test2.v + 1])
            table.remove(decodedJson["placesZ"][combo_test2.v + 1])
        end
    imgui.EndChild()
    imgui.End()
а также как вставить координаты в ImInt на примере

Луа:
if imgui.Button(u8"Скопировать текущие координаты", imgui.ImVec2(250,20)) then
    local x, y, z = getCharCoordinates()
    textnewplaceX = x
    textnewplaceY = y
    textnewplaceZ = z
end
 
Последнее редактирование:

Hinаta

Известный
782
352
а также как вставить координаты в ImInt на примере
Lua:
--перед фреймом
local textnewplaceX = imgui.ImInt(0)
local textnewplaceY = imgui.ImInt(0)
local textnewplaceZ = imgui.ImInt(0)

--в фрейм
if imgui.Button(u8"Скопировать текущие координаты", imgui.ImVec2(250,20)) then
    local x, y, z = getCharCoordinates()
    textnewplaceX.v = x
    textnewplaceY.v = y
    textnewplaceZ.v = z
end
 

Дядя Энрик.

Активный
321
75
подскажите пожалуйста, как можно убрать драв в гуи чтоб туда передавались только значения?
сказали использовать text:gsub , но оно передаёт полностью весь драв вместо определённого. Нужно убрать ~w~_ эту шляпу в гуи и передавать только %d+.%d+ m / %d+.%d+
Код:
if data.text:find('HP~w~_(%d+).(%d+)') or data.text:find('HP~w~_(%d+).(%d+)_m_/_(%d+).(%d+)_r') then
        hpspec = data.text:match('%d+.%d+_m_/_%d+.%d+_r') or data.text:match('~w~_%d+.%d+_m_/_%d+.%d+_r')
        end
всё ещё актуал
1696233558734.png
, эту шляпу убрать и оставить только название кара
 
Последнее редактирование:

siwage

Активный
192
66
  • Нравится
Реакции: Дядя Энрик.

Andrinall

Известный
689
535
эту шляпу убрать
Lua:
data.text = data.text:gsub("(~[nrgbwsyplhud%<%>]~)", "", math.floor(#data.text / 3)) -- при таком переопределении главное не ретурнить дату, а то оно и в текстдраве будет без тегов
должно удалить все ~w~ и прочие теги в тексте текстдрава, кроме ~k~ т.к. там идёт имя клавиши, такое себе удалять то, что по факту нужно.
 
  • Нравится
Реакции: Дядя Энрик.

Дядя Энрик.

Активный
321
75
Попробуй так

code:
if data.text:find('HP~w~_(%d+).(%d+)') or data.text:find('HP~w~_(%d+).(%d+)_m_/_(%d+).(%d+)_r') then
    data.text = data.text:gsub("~w~_", "")
    hpspec = data.text:match('%d+.%d+_m_/_%d+.%d+_r')
end
Lua:
if data.text:find('S_~w~(%d+).(%d+)') then
        data.text = data.text:gsub("S_~w~", "")
        shspec = data.text:match('S_~w~%d+.%d+')
    end
при таком моменте уходит в nil

Lua:
data.text = data.text:gsub("(~[nrgbwsyplhud%<%>]~)", "", math.floor(#data.text / 3)) -- при таком переопределении главное не ретурнить дату, а то оно и в текстдраве будет без тегов
должно удалить все ~w~ и прочие теги в тексте текстдрава, кроме ~k~ т.к. там идёт имя клавиши, такое себе удалять то, что по факту нужно.
все значения уходят в nil
 

Madeo Capaldi

Участник
42
2
как мне вызвать функцию в другой функции?
Lua:
 function  ev.onCreate3DText(idObject, color, position, distance, testLOS, attachedPlayerId, attachedVehicleId, textObject)
       lua_thread.create(function ()
            while true do wait(0)
             local     x, y, z = getCharCoordinates(PLAYER_PED)
             dist =  getDistanceBetweenCoords3d(x, y, z, position.x , position.y, position.z )
                                          runToPoint (-1085.5953369141 ,-2518.734375, 63.520053863525,false, false)
                                           wait(1000)
                                           local data = samp_create_sync_data('player')
                                           data.keysData = data.keysData + 1024
                                           data.send()
                                           wait(8000)
                              вот как пытался
                                ev.onShowDialog(_,text)
                                text:find"%[Информация%] %{ffffff%}Вы набрали полное ведро воды."
                                  runToPoint (-1085.5953369141 ,-2518.734375, 63.520053863525,false, false)[/COLOR]
                               
                        Вот эту функцию хочу вызвать
                                                  function ev.onServerMessage(_,text)
                                                  if text:find("%[Информация%] %{ffffff%}Вы набрали полное ведро воды.") then
                                                  end
[/COLOR]
 

auf.exe

Участник
41
12
Lua:
--перед фреймом
local textnewplaceX = imgui.ImInt(0)
local textnewplaceY = imgui.ImInt(0)
local textnewplaceZ = imgui.ImInt(0)

--в фрейм
if imgui.Button(u8"Скопировать текущие координаты", imgui.ImVec2(250,20)) then
    local x, y, z = getCharCoordinates()
    textnewplaceX.v = x
    textnewplaceY.v = y
    textnewplaceZ.v = z
end
Уже сделал, там нужно флоат вставить. Как удалить конкретную ячейку в списке подскажите пожалуйста