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

ARaG0RN

Активный
136
49
Как через imgui сделать поле куда можно написать кнопку активации. Использую vkeys, как можно сделать, чтоб в imgui можно было указать например "Y", а потом это перевести в VK_Y?
 

Double Tap Inside

Известный
Проверенный
1,899
1,244
Как чекнуть, что ты попал в меню паузы "Esc" (афк)?
(Пока не рассматриваем вариант забиндить на Еск то, что я хочу выполнить)
 

штейн

Известный
Проверенный
1,001
687
Как чекнуть, что ты попал в меню паузы "Esc" (афк)?
(Пока не рассматриваем вариант забиндить на Еск то, что я хочу выполнить)
Lua:
sampIsPlayerPaused(int id)

Как через imgui сделать поле куда можно написать кнопку активации. Использую vkeys, как можно сделать, чтоб в imgui можно было указать например "Y", а потом это перевести в VK_Y?
Lua:
text = 'Y'
a = 'VK_'..text

Как сделать примерное чтение с диалога?

Допустим...пишу команду, открывается диалог, и там нужная мне информация.

Я пишу другую команду, и он автоматически пишет в чат информацию с диалогового окна (то бишь, чтение + копирование + отправка).
можно через samp.lua onShowDialog, вытаскивать оттуда текст, либо через sampGetDialogText()

как правильно сделать зажимной азот? пока держу кнопку - азот работает, отпускаю кнопку - азот чтобы не работал.

Код:
function main()
while true do
  wait(0)
while not isCharInAnyCar(PLAYER_PED) do wait(0) end
if isKeyDown(1) then  nitro()
end
end
end

function nitro()
    car = storeCarCharIsInNoSave(PLAYER_PED)
    giveNonPlayerCarNitro(car)
end
Lua:
while isKeyDown(18) do nitro() end
 
Последнее редактирование:

pwned

Участник
142
5
Почему на английском пишет текст,а на русском нет?
Код:
if imgui.Button(u8'Принять') then
                sampSendChat("/c "..u8:decode(mainCFG.Settings.m).."")
            end
 

Double Tap Inside

Известный
Проверенный
1,899
1,244
sampIsPlayerPaused(int id)
А она вызовиться у меня при паузе? Я просто замечал, что скрипты стопятся нахер на паузе. Мне надо не кого-то, а именно меня. Когда я в эскейп залетаю, чтобы выполнился кодик и обратно. А если я буду оффлайн, у меня не будет айди или оно всегда да какое то есть?
 

alexferal

Новичок
2
0
тут только скрипты дл ягта чинятся? для ВоВ не подскажете где кодеров найти? аддон кривой починить помочь.
 

Quasper

Известный
834
354
Да уже решил проблему, еще такой вопрос, как чтобы при заходе в игру вписывал команду?
Lua:
function main()
while not isSampAvailable() do wait(200) end
--Если хочешь до спавна то впиши  сюда  команду
if sampIsLocalPlayerSpawned() then
--Если после спавна то сюда
end
while true do
wait(0)
--Тут основной код
end
end
 

#kweeZ

Известный
577
122
Как сделать, чтобы после пройденного времени таймер обновлялся, и шёл заново?
Код:
        lua_thread.create(function()
         local rultime = os.clock() * 1000 + 120000
             local rtime = math.floor((rultime - os.clock() * 1000 ) / 1000)
             local seconds = rtime % 60
             local minutes = math.floor(rtime / 60)
         end)
 

kAerain

Участник
62
10
Забыл про них, спасибо.

как завести движок у машины? (пытался через
setCarEngineOn,
switchCarEngine,
mem.setint8(pointer + 0x428, 0)
)
Ни один из этих способов не помог. На секунду заводит и моментально вырубает на сервере без всяких защит.
Lua:
if isCharInAnyCar(PLAYER_PED) then
        local car = storeCarCharIsInNoSave(PLAYER_PED)
        local carfuck = isCarEngineOn(car)
        if getDriverOfCar(car) == PLAYER_PED then
            local pointer = getCarPointer(car)
            if carfuck then
                if imgui.Button(u8'Заглушить двигатель##btn228') then
                    --mem.setint8(pointer + 0x428, 0)
                    setCarEngineOn(car, false)
                end
            elseif not carfuck then
                if imgui.Button(u8'Завести двигатель##btn1337') then
                  --mem.setint8(pointer + 0x428, 16)
                    setCarEngineOn(car, true)
                end
            end
        end
    end

Lua:
require "lib.moonloader"

function main()
    while not isSampAvailable() do wait(0) end
    while sampGetCurrentServerName() == 'SA-MP' do wait(0) end
    sampAddChatMessage('| Started.', -1)
    sampRegisterChatCommand('engine', function()
            if isCharInCarDriver(playerPed) then
                if isCarEngineOn(storeCarCharIsInNoSave(playerPed)) then   
                    switchCarEngine(storeCarCharIsInNoSave(playerPed), false)
                    sampAddChatMessage('| Заглузил двигатель.', -1)
                else
                    switchCarEngine(storeCarCharIsInNoSave(playerPed), true)
                    sampAddChatMessage('| Завожу двигатель.', -1)
                end
            else
                sampAddChatMessage('| Вы не зарулем автомобиля.', -1)
            end
    end)
    while true do wait(0) end
end

function isCharInCarDriver(ped)
    return isCharInAnyCar(ped) and getDriverOfCar(storeCarCharIsInNoSave(ped)) == ped
end
 

neYarik.

Участник
83
9
Lua:
require "lib.moonloader"

function main()
    while not isSampAvailable() do wait(0) end
    while sampGetCurrentServerName() == 'SA-MP' do wait(0) end
    sampAddChatMessage('| Started.', -1)
    sampRegisterChatCommand('engine', function()
            if isCharInCarDriver(playerPed) then
                if isCarEngineOn(storeCarCharIsInNoSave(playerPed)) then  
                    switchCarEngine(storeCarCharIsInNoSave(playerPed), false)
                    sampAddChatMessage('| Заглузил двигатель.', -1)
                else
                    switchCarEngine(storeCarCharIsInNoSave(playerPed), true)
                    sampAddChatMessage('| Завожу двигатель.', -1)
                end
            else
                sampAddChatMessage('| Вы не зарулем автомобиля.', -1)
            end
    end)
    while true do wait(0) end
end

function isCharInCarDriver(ped)
    return isCharInAnyCar(ped) and getDriverOfCar(storeCarCharIsInNoSave(ped)) == ped
end
я вроде писал, что пробовал свитчкаренжин?