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

niki4

Участник
92
10
Здравствуйте, решил написать скриптик для ловли объявлений в СМИ простой, но столкнулся с кучей проблем, одну из которой я до сих пор решить не смог, а в интернете инфы нет никакой.
Код:
label = 0 -- устанавливаю дефолтное значение для ловли
  sampAddChatMessage(tag_color .. '[MM Editor]:' .. " {D3D3D3}Скрипт успешно активирован. Для ловли нажмите клавишу {1E90FF}F3{D3D3D3}.", 0xD3D3D3)
  sampRegisterChatCommand('f3', cmd_f3)
  while true do
  if label == 0 then renderFontDrawText(my_font, 'Ловля{1E90FF} [F3]{FFFFFFFF}:\n{FFFFFFFF}Режим ожидания..', 10, 1030, 0xFFFFFFFF) end
  if label == 1 then renderFontDrawText(my_font, 'Ловля{1E90FF} [F3]{FFFFFFFF}:\n{1E90FF}Идёт ловля.', 10, 1030, 0xFFFFFFFF) end
  if label == 2 then renderFontDrawText(my_font, 'Ловля{1E90FF} [F3]{FFFFFFFF}:\n{8B0000}Ошибка.', 10, 1030, 0xFFFFFFFF) end
  if label == 5 then renderFontDrawText(my_font, 'Ловля{1E90FF} [F3]{FFFFFFFF}:\n{8B0000}Перезапуск ловли.', 10, 1030, 0xFFFFFFFF) end
    wait(0) -- беск цикл
  if isKeyJustPressed(VK_F3) and label == 0 or isKeyJustPressed(VK_F3) and label == 2 or label == 5 then
    wait(10)
    sampAddChatMessage(tag_color .. '[MM Editor]:' .. " {D3D3D3}Ловля активирована. Для приостановки зажмите клавишу F3.", 0xD3D3D3)
    label = 1 -- изменяю значение на 1 и говорю ей че делать
      repeat
      wait(100)
      sampSendChat('/edit')
      wait(1400)
      until
      label == 2 or isKeyDown(VK_F3) and label == 1
      wait(100)
      if label == 1 then sampAddChatMessage(tag_color .. '[MM Editor]:' .. " {D3D3D3}Ловля приостановлена. Для возобновления нажмите клавишу F3.", 0xD3D3D3) wait(300) label = 0 wait(300) else sampAddChatMessage(tag_color .. '[MM Editor]:' .. " {D3D3D3}Ловля принудительно остановлена для избежания кика.", 0xD3D3D3) wait(10) sampAddChatMessage(tag_color .. '[MM Editor]:' .. " {D3D3D3}Ловля будет продолжена автоматически через 10 секунд.", 0xD3D3D3) wait(10000) label = 5
      end
    end
  end -- беск цикл конец
end
как то так выглядит почти весь код (да-да, я говнокодер, для себя не жалко) и я не могу понять каким образом сделать так, чтобы при разных label отображался разный текст в текстдраве, он у меня отображается при дефолтном значении, а когда идёт сама ловля или перезапуск её ничего отображаться не хочет(тк функция не прошла полный круг), если вставляю в нужную ситуацию через while, то тогда сама ловля не идёт и скрипт отказывается работать дальше. Возможно есть какой-то аналог repeat, чтобы он работал без условия или можно его как то подставить? В общем жду реальной help in this question, потому что я не знаю как дальше двигаться, а без текстдрава моя затея подучить Луа была бы глупой, ведь то же самое можно было сделать по сути и в биндере((
У тебя сразу же меню редактирования открывается по команде /edit?
 

danywa

Активный
358
50
Lua:
if msg:match('Вы перетащили мешков') then
как сделать чтобы полученная информация с чата сохранялась в ини/тхд файле для рак бота
 

NetyEgo

Участник
164
10
thisScript():unload() -- выгрузить скрипт

В imgui.RadioButton при указании аргумента ставится .v, так-же необходимо самому задавать значение, поэтому лучше юзай imgui.Checkbox, цифры 1 и 2 не к чему там. Создавай новый Аргумент.
Lua:
if imgui.RadioButton(u8"Команды Arizona RP.", cmdserver.v) then
    cmdserver.v = not cmdserver.v
    if cmdserver.v then
        sampAddChatMessage('флудим', -1)
    end
end

Lua:
local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8 -- проблема с русским языком


local ex, ey = getScreenResolution()
imgui.SetNextWindowPos(imgui.ImVec2(ex / 2 - 200, ey / 2 - 200), imgui.Cond.FirstUseEver) -- окно по середине


photo = imgui.CreateTextureFromFile(getGameDirectory().."\\moonloader\\pictures\\fatality.png")
if photo then -- вставляем в имгуи фотку, которая находится по дерриктории мун > фотки > фаталити.пнг
    imgui.Image(image1, imgui.ImVec2(140, 20)) -- imgui.ImVec2 - это размер фотки
end

Хуком
Вот посмотрел ответ на мой вопрос по поводу RadioButton. И такой способ мне не как не подходит, потому что либо через Checkbox(будет вызывать проблемы, как и в дизайне, так и в скрипте). И cmdserver.v тоже не работает, потому что если я нажмал на команды даймонда, то сразу отключаются аризоновские и наоборот, и вот цифры 1, 2, нужны для сохранения скрипта в ini. Повторяю мне нужна только проверка. нашёл ответ забыл в проверку .v добавить "if cmdserver.v == 1 then"
как разукрасить текст в imgui?
 
Последнее редактирование:

Quasper

Известный
834
354
Вот посмотрел ответ на мой вопрос по поводу RadioButton. И такой способ мне не как не подходит, потому что либо через Checkbox(будет вызывать проблемы, как и в дизайне, так и в скрипте). И cmdserver.v тоже не работает, потому что если я нажмал на команды даймонда, то сразу отключаются аризоновские и наоборот, и вот цифры 1, 2, нужны для сохранения скрипта в ini. Повторяю мне нужна только проверка. нашёл ответ забыл в проверку .v добавить "if cmdserver.v == 1 then"
как разукрасить текст в imgui?
imgui.TextColored(text, imgui.ImVec4(1, 1, 1, 1))
 

NetyEgo

Участник
164
10
LUA:
    if activations.v then
        imgui.SetNextWindowSize(imgui.ImVec2(900, 905), imgui.Cond.FirstUseEver)
        imgui.SetNextWindowPos(imgui.ImVec2(sw / 2, sh / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
   
        imgui.Begin(fa.ICON_FA_SPINNER .. " Helper", activations, imgui.WindowFlags.AlwaysAutoResize + imgui.WindowFlags.NoCollapse + imgui.WindowFlags.NoResize)          
        imgui.End()
    end
вот код imgui(третий Imgui, если это как то повлияет) и вот код imgui.Process
LUA:
        if vzaimod.v or main_window_state.v or activations.v then
            imgui.Process = true
        else  
            imgui.Process = false
        end
и этот imgui, не закрыть и он всё время появляется
и вот код main
LUA:
    sampRegisterChatCommand(mainIni.config.activations, function() activations.v = not activations.v end)
imgui.TextColored(text, imgui.ImVec4(1, 1, 1, 1))
объясни что да как, и я попытался сделать так imgui.TextColored(u8"РП мод: активирован" , imgui.ImVec4(3, 3, 3, 3)) и крашнулась игра
 
Последнее редактирование:

Manuel Leon

Известный
266
166
Попытался сделать 2 окна imgui, но крашит скрипт
PHP:
local imgui = require 'imgui'
local key = require 'vkeys'
local label = 0
local login = 0
local encoding = require 'encoding' -- загружаем библиотеку
encoding.default = 'CP1251' -- указываем кодировку по умолчанию, она должна совпадать с кодировкой файла. CP1251 - это Windows-1251
u8 = encoding.UTF8 -- и создаём короткий псевдоним для кодировщика UTF-8
local apass = imgui.ImBuffer(256)
local imgui_1 = imgui.ImBool(false)
local imgui_2 = imgui.ImBool(false)
function imgui.OnDrawFrame()
  if imgui_1.v then
    imgui.SetNextWindowSize(imgui.ImVec2(250, 100), imgui.Cond.FirstUseEver) -- меняем размер
    imgui.Begin(u8'Авторизация') -- обратите внимание на u8 перед текстом, это и есть преобразование кодировки
    imgui.Text(u8'Введите свой пароль для авторизации')
    imgui.Text(u8'Пароль:')
    imgui.SameLine();
    if imgui.InputText(u8'', apass, imgui.ImVec2(25, 0)) then end
    if imgui.Button(u8'Авторизоваться') then
      checkpassd(arg)
    end
end
  if imgui_2.v then
      imgui.SetNextWindowSize(imgui.ImVec2(250, 200), imgui.Cond.FirstUseEver)
      imgui.Begin('Второе окно', s_openn, imgui.WindowFlags.MenuBar)
      imgui.Text(u8'Какой-то текст уляля')
      imgui.End()
      end
  end
local function commandsReg()
  sampRegisterChatCommand("test", test)
end
local function welcome()
  if label == 1 then
    sampAddChatMessage("{FFFFFF}Скрипт не загружен. Автор: NickName")
      thisScript():unload();
  else
    sampAddChatMessage("{ffffff}Загрузка скрипта произошла успешно. Автор скрипта: NickName")
    sampAddChatMessage("{ffffff}Для активации скрипта нажмите клавишу M(англ)")
  end
end
function main()
  if not isSampLoaded() or not isSampfuncsLoaded() then return end
  while not isSampAvailable() do wait(100) end
  commandsReg();
  welcome();
  while true do
    wait(0)
    if wasKeyPressed(key.VK_X) then
      imgui_1.v = not imgui_1.v
    end
    if wasKeyPressed(key.VK_Z) then
      imgui_2.v = not imgui_2.v
    end
    imgui.Process = imgui_1.v
    imgui.Process = imgui_2.v
  end
end
function checkpassd(arg)
  arg = apass.v
  if tonumber(login) == 0 then
    if #arg == 0 or tonumber(arg) == nil or type(tonumber(arg)) ~= "number" then
      sampAddChatMessage('Доступны только цифры')
    else
      if tonumber(arg) == 5555 then --Тут твой пароль
        sampAddChatMessage('{ffffff}Авторизация выполнена успешно.')
        login = 1
        imgui_1.v = false
      else
        sampAddChatMessage('{FFFFFF}Ошибка авторизации.')
        login = 0
      end
    end
  else
    sampAddChatMessage('{ffffff}Ошибка, вы уже авторизованы')
  end
end
function test(arg)
  if tonumber(login) == 1 then
    sampAddChatMessage('{ffffff}Действия прошли успешно, вы авторизованы.')
  else
    sampAddChatMessage('{ffffff}Ошибка, вы не авторизовались, нажмите клавишу M(англ)')
  end
end
--function teleport()
--    while not isSampAvailable() do wait(100) end
--    bool,x,y,z = getTargetBlipCoordinates()
--    if bool then setCharCoordinates(playerPed,x,y,z)
--  end
--end
--    while true do wait(0)
--  end
--end
Ты сначала приравнял Имгуи.Процесс к одной переменной, затем к другой. Попробуй так: imgui.Process = imgui_1.v or imgui_2.v
объясни что да как, и я попытался сделать так imgui.TextColored(u8"РП мод: активирован" , imgui.ImVec4(3, 3, 3, 3)) и крашнулась игра

imgui.ImVec4 не принимает значение больше 1 или меньше 0.
 

Callow

Известный
62
62
Как поставить картинку на кнопку? Имгуи
Lua:
local ImGui = require 'lib.ImGui'

local texture = nil
function main()
    texture = ImGui.CreateTextureFromFile("moonloader/im.jpg")
    ImGui.Process = true
    wait(-1)
end

function ImGui.OnDrawFrame()
    ImGui.ImageButton(texture, ImGui.ImVec2(200,200))
end

1590053656216.png
 
  • Нравится
Реакции: samp1e.