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

Roger Camillo

Известный
51
7
Lua:
sampSetChatInputText("/selldrugs 100 1000")
sampSetChatInputEnabled(true)


Lua:
myID = select(2, sampGetPlayerIdByCharHandle(PLAYER_PED))
myNickname = sampGetPlayerNickname(myID)

if myNickname ~= "Roger" then
    thisScript():unload()
end


Устанавливай стиль
Lua:
function apply_castom_style()
    imgui.SwitchContext()
    local style = imgui.GetStyle()
    local colors = style.Colors
    local clr = imgui.Col
    local ImVec4 = imgui.ImVec4

    colors[clr.WindowBg] = ImVec4(0, 0, 0, 1)
end
apply_castom_style()

Не работает((
 

Di3

Участник
432
20
через ансинхронные запросы делай
оно гавно,после нескольких запросов ошибку выбивает.

После нескольких запросов раз в минуту .

[21:33:20.739097] (error) Script: resource unavailable try again: resource unavailable try again
stack traceback:
[C]: in ?
F:\Grand Theft Auto San Andreas\moonloader\test.luac: in function 'asyncHttpRequest'
 

Evgeniy_Pavuk

Активный
119
79
Помогите пожалуйста умные люди! Скрипт не хочет скачивать файл.
 

Вложения

  • 1help.lua
    995 байт · Просмотры: 6

Roger Camillo

Известный
51
7
Lua:
function test()
  result, myId = sampGetPlayerIdByCharHandle(playerPed)
  if result then
    myNickname = sampGetPlayerNickname(myId)
    if myNickname ~= 'Rodger_Camillo' then
      thisScript():unload()
    end
  end
end


Lua:
function activatecmd()
    if active == 0 then
       active = 1
       sampAddChatMessage("{8B0000}[Bot-AVL]: {FFFFFF}Вы изменили статус скрипта на {8B0000}[Включен]{FFFFFF}.", 0xFFFFFFFF)
    else
       active = 0
       sampAddChatMessage("{8B0000}[Bot-AVL]: {FFFFFF}Вы изменили статус скрипта на {00FF00}[Выключен]{FFFFFF}.", 0xFFFFFFFF)
    end
end

Не получается у меня сделать команду по нику, распиши пожалуйста что к чему, вот эти result, myId = sampGetPlayerIdByCharHandle(playerPed)
и тд тп, куда их вставлять и команду если не сложно настрой.. а то чёт не доганяю, или попросту не выходит реализовать
 

getsdfssdfsdfs

Участник
45
0
Вот допустим я слежу за человеком, как мне его ID захватить для lua биндера?

Пишу скрипт меню через imgui, при написании заголовка окна на кодировке UTF-8 нету проблем(всё на русском и английском). А вот когда мне нужно чтоб в чат написало
Допустим:
sampSendChat('Привет мир') - он напишет это в чат непонятными каракулями.
Подскажите что можно с этим сделать?

UP: Вечно менять кодировки я уже устал(((((
 

Dmitriy Makarov

25.05.2021
Проверенный
2,479
1,113
а шо делать если не могу перемещать окно ImGui? ну тип я ЛКМ зажимаю на окне и пытаюсь передвигать, но оно чет не хочет
менял только стиль окна и размер, до этого все было нормальн

Размер и центрирование окна
Lua:
imgui.SetNextWindowSize(imgui.ImVec2(855, 470), imgui.Cond.FirstUseEver)
imgui.SetNextWindowPos(imgui.ImVec2 (200, 120))

Стиль
Lua:
function apply_castom_style()
    imgui.SwitchContext()
    local style = imgui.GetStyle()
    local colors = style.Colors
    local clr = imgui.Col
    local ImVec4 = imgui.ImVec4

    colors[clr.WindowBg] = ImVec4(0, 0, 0, 0.95)
end
apply_castom_style()
 

Belo4ka_belka

Известный
191
7
а шо делать если не могу перемещать окно ImGui? ну тип я ЛКМ зажимаю на окне и пытаюсь передвигать, но оно чет не хочет
менял только стиль окна и размер, до этого все было нормальн

Размер и центрирование окна
Lua:
imgui.SetNextWindowSize(imgui.ImVec2(855, 470), imgui.Cond.FirstUseEver)
imgui.SetNextWindowPos(imgui.ImVec2 (200, 120))

Стиль
Lua:
function apply_castom_style()
    imgui.SwitchContext()
    local style = imgui.GetStyle()
    local colors = style.Colors
    local clr = imgui.Col
    local ImVec4 = imgui.ImVec4

    colors[clr.WindowBg] = ImVec4(0, 0, 0, 0.95)
end
apply_castom_style()
imgui.SetNextWindowPos(imgui.ImVec2 (200, 120)) закомментируй. Ты сам вдумайся, что эта команда делает, а что пытаешься сделать ты с окном.
 

FBenz

Активный
328
40
Ребят, подскажите пожалуйста, как сделать так чтобы при команде к примеру /add.wait устанавливалось то значение которые я напишу.

Рассказываю что я хочу сделать чтобы вы поняли, вообщем хочу в скрипт себе добавить задержку на функцию одну.
Мне нужно чтобы по команде /add.wait (задержка), она устанавливалась.

Типо: /add.wait (задержка) чтобы устанавливалось оно на
Полный бред тебе там написали.
Просто делаешь так:
Lua:
local zaderzhka = 3000 -- в начало скрипта в свалку переменных
sampRegisterChatCommand('add.wait', function(arg)
 zaderzhka = arg
end) -- Это регистрация команды. Если поставить '/add.wait' то в игре придется вписывать два слеша перед командой.
-- Функу пихаешь в main До бесконечного цикла.
wait(activate) -- просто там, где надо
-- wait() лучше лучше юзать внутри lua_thread.create() чтобы не стопить весь скрипт, если тебе это нужно.
-- При надобности слово local в регистрации переменной убираешь, то бишь будет глобальная переменная.
-- Естественно, что это самый простой вариант, показывающий как это вообще работает.
-- При надобности добавляешь проверки/сохранение в ini файл.

а шо делать если не могу перемещать окно ImGui? ну тип я ЛКМ зажимаю на окне и пытаюсь передвигать, но оно чет не хочет
менял только стиль окна и размер, до этого все было нормальн

Размер и центрирование окна
Lua:
imgui.SetNextWindowSize(imgui.ImVec2(855, 470), imgui.Cond.FirstUseEver)
imgui.SetNextWindowPos(imgui.ImVec2 (200, 120))

Стиль
Lua:
function apply_castom_style()
    imgui.SwitchContext()
    local style = imgui.GetStyle()
    local colors = style.Colors
    local clr = imgui.Col
    local ImVec4 = imgui.ImVec4

    colors[clr.WindowBg] = ImVec4(0, 0, 0, 0.95)
end
apply_castom_style()
imgui.SetNextWindowPos(imgui.ImVec2 (200, 120)) замени на imgui.SetNextWindowPos(imgui.ImVec2 (200, 120), imgui.Cond.FirstUseEver)
Этот флаг позволяет менять значения в последствии.
 
  • Нравится
Реакции: Dmitriy Makarov

The Spark

Известный
654
666
Как сделать функцию по типу "Обратная связь" туда вводишь текст и он приходит мне на почту/сайт?
Есть функция которая проверяет что игрок за стеной?
 

Petr_Sergeevich

Известный
Проверенный
707
296
Как сделать функцию по типу "Обратная связь" туда вводишь текст и он приходит мне на почту/сайт?
Есть функция которая проверяет что игрок за стеной?
Lua:
-- Проверка на присутствие препятствий между двумя точками
isLineOfSightClear(fromX, fromY, fromZ, toX, toY, toZ, checkBuildings, checkVehicles, checkActors, checkObjects, checkParticles)

По поводу обратной связи: нужно работать с вебом и БД, со стороны скрипта - только запросы
 

lanini

Известный
35
9
Данный имгуй взял из другого скрипта и вставил свой. Все прописал. Мадрассо говорит что нет проблем никаких, но вылетает гта. В логе пусто. Код:
Код:
function imgui.OnDrawFrame()
    -- Main Window
    if window.v then
        local iScreenWidth, iScreenHeight = getScreenResolution()
        imgui.SetNextWindowPos(imgui.ImVec2(iScreenWidth / 2, iScreenHeight / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
        imgui.SetNextWindowSize(imgui.ImVec2(400, 150), imgui.Cond.FirstUseEver)
        vkid = data.user_id[1]
        imgui.Begin(u8(thisScript().name.. ": Settings   |   Ваш ID: " ..tostring(vkid)), window, imgui.WindowFlags.NoResize + imgui.WindowFlags.NoCollapse + imgui.WindowFlags.NoMove)
        imgui.Text(u8("Оповещения ВКонтакте"))
        imgui.SameLine(370)
        imgui.Checkbox('##vkactive', vkactive)
        imgui.Text(u8("Звуковые оповещения"))
        imgui.SameLine(370)
        imgui.Checkbox('##zvuk', zvuk)
        imgui.Text(u8("Оповещения о репортах"))
        imgui.SameLine(370)
        imgui.Checkbox('##adm', adm)
        imgui.Text(u8("Оповещения о рулетке"))
        imgui.SameLine(370)
        imgui.Checkbox('##rulet', rulet)
        imgui.Text(u8("Оповещения о SMS"))
        imgui.SameLine(370)
        imgui.Checkbox('##sms', sms)
        imgui.End()
    end
end