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

Rei

Известный
Друг
1,610
1,666
можно ли создавать циклом функционирующие чекбоксы, не создавая отдельно для каждого imbool переменную? для типа такого массива
Код:
settings['test1'] = false,
settings['test2'] = false,
settings['test3'] = true
 

Myradov|

Известный
361
106
Lua:
  --это я кинул в цикл
    health = getCharHealth(PLAYER_PED)
    if health < hpmin.v and health > hpmax.v then -- на эту строчку хуярит ошибка
        sampSendChat(hpnahui.v)
    end
  
-- тут стандартные значения
local hpmin = imgui.ImInt(mainIni.config.cfg3)
local hpmax = imgui.ImInt(mainIni.config.cfg4)
Выбивает ошибку [17:00:44.629652] (error) test.lua: D:\Program Files\1337SAMP_MODLOADER\moonloader\test.lua:30: attempt to index global 'hpmin' (a nil value)
В чем проблема?
 

riassemss

Новичок
22
5
Как можно делать активацию скритпа нажатием 2 и более клавиш?
Lua:
local vkeys = require 'vkeys'

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    
    while true do
        wait(0)
        if isKeyDown(клавиша 1) and isKeyJustPressed(клавиша 2) then
            -- code
        end
    end
end
 
  • Нравится
Реакции: S-Sirius

copypaste_scripter

Известный
1,261
234
хочу сделать скрипт для того, чтобы когда встану на руду - сам копал, или если я встану на руду и нажму на кнопку чтобы начинал копать. кто может помочь?
 

S-Sirius

Известный
351
21
Можно ли поставить проверку на прицеливания? Допустим если игрок прицелился с снайпера - то выполнить код
 

Rei

Известный
Друг
1,610
1,666
Можно ли поставить проверку на прицеливания? Допустим если игрок прицелился с снайпера - то выполнить код
хук camMode в аим синхре/проверка на зажатую кнопку + оружие в руках
был еще способ с памятью, но он говно
 

looney_

Участник
48
10
Lua:
  --это я кинул в цикл
    health = getCharHealth(PLAYER_PED)
    if health < hpmin.v and health > hpmax.v then -- на эту строчку хуярит ошибка
        sampSendChat(hpnahui.v)
    end
 
-- тут стандартные значения
local hpmin = imgui.ImInt(mainIni.config.cfg3)
local hpmax = imgui.ImInt(mainIni.config.cfg4)
Выбивает ошибку [17:00:44.629652] (error) test.lua: D:\Program Files\1337SAMP_MODLOADER\moonloader\test.lua:30: attempt to index global 'hpmin' (a nil value)
В чем проблема?
Зайди в свой кфг файл и пропиши там все данные, ибо ты используешь imint, а там ничего
Или создай проверку на директорию и создание ее, у тебя должно быть хоть какое то там значение
 

looney_

Участник
48
10
Как получить 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
Можно ли поставить проверку на прицеливания? Допустим если игрок прицелился с снайпера - то выполнить код
 

S-Sirius

Известный
351
21
По идеи код должен выглядеть так, не? Тут у меня чёт не работает
Lua:
weapon = getCurrentCharWeapon(playerPed)
local valid, ped = getCharPlayerIsTargeting(PLAYER_HANDLE)
if weapon == 34 and valid and doesCharExist(ped) then
    -- Code
end
Типо если игрок прицелился с снайпера то...
 

Myradov|

Известный
361
106
Зайди в свой кфг файл и пропиши там все данные, ибо ты используешь imint, а там ничего
Или создай проверку на директорию и создание ее, у тебя должно быть хоть какое то там значение
Уже исправил. Проблема была в другом
 

looney_

Участник
48
10
хочу сделать скрипт для того, чтобы когда встану на руду - сам копал, или если я встану на руду и нажму на кнопку чтобы начинал копать. кто может помочь?
Вроде на Аризоне пишет какой то текст на экран когда ты на руде, просто перехвати дисплей текст (samp events)
По идеи код должен выглядеть так, не? Тут у меня чёт не работает
Lua:
weapon = getCurrentCharWeapon(playerPed)
local valid, ped = getCharPlayerIsTargeting(PLAYER_HANDLE)
if weapon == 34 and valid and doesCharExist(ped) then
    -- Code
end
Типо если игрок прицелился с снайпера то...
Эта функция вроде работает с маркером сверху, если со снайперки он работает, то пиши дальше свой код