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

Dmitriy Makarov

25.05.2021
Проверенный
2,478
1,113
выводить тем же циклом, что и добавлял в массив
1603743477764.png
1603743538654.png

;0
Lua:
for i = 400, 610 do
    imgui.Image(VehicleImages[i], imgui.ImVec2(140, 85))
    imgui.Separator()
end
 
  • Ха-ха
Реакции: Rei

G W

Участник
141
5
Как сказать скрипту что бы он при клике на button он вводил его в InputText
sa-mp-055.png
 
  • Злость
Реакции: Izvinisb

TWP

Участник
53
1
Народ, как это:
Lua:
local result, ped = getCharPlayerIsTargeting(PlAYER_HANDLE)
if result then
local result_, id = sampGetPlayerIdByCharHandle(ped)
if result_ then
Заменить на команду? Суть в том что скрипт берёт значения id и сравнивает его с переменной в onShowDialog, нужно сделать чтобы он сравнивал id который будет просто введён в команду
 

ufdhbi

Известный
Проверенный
1,455
861
Народ, как это:
Lua:
local result, ped = getCharPlayerIsTargeting(PlAYER_HANDLE)
if result then
local result_, id = sampGetPlayerIdByCharHandle(ped)
if result_ then
Заменить на команду? Суть в том что скрипт берёт значения id и сравнивает его с переменной в onShowDialog, нужно сделать чтобы он сравнивал id который будет просто введён в команду
Lua:
sampRegisterChatCommand("fcc", function(id)
    if id ~= nil and #id > 0 then
        id = id:match("(%d+)")
        if id ~= nil and sampIsPlayerConnected(id) then
            -- тут писать
        end
    end
end)
 
  • Нравится
Реакции: TWP
У

Удалённый пользователь 341712

Гость
Как сделать так, чтобы inputText был выбран сразу после активации окна, чтобы туда можно было вводить, а не наводиться мышкой, нажимать и только тогда вводить
 

ufdhbi

Известный
Проверенный
1,455
861
Как сделать так, чтобы inputText был выбран сразу после активации окна, чтобы туда можно было вводить, а не наводиться мышкой, нажимать и только тогда вводить
Lua:
imgui.SetKeyboardFocusHere()
imgui.InputText(...)
 

БеzликиЙ

Автор темы
Проверенный
802
452
суть в чём, хочу написать бота, который будет ездить по массиву из меток. и я его даже уже почти написал, если бы не одна проблемка. я не знаю, как заставить скрипт ждать, пока бот не приедет на очередной чекпоинт, перед тем, как ехать на следующий (чекпоинт = квадратная зона 20x20 вокруг координат). wait работает только в main, а у меня бот активируется функцией по команде... в общем, вот говнокод, помогите чем-нибудь.

Lua:
stop=0
m=0
x=0
y=0
z=0
function main()
    repeat wait(0) until isSampAvailable()
    sampRegisterChatCommand("metal.go", metal)
    sampAddChatMessage("MetallolomShit loaded", 0)
    sampRegisterChatCommand("metal.stop", function()
        taskWarpCharIntoCarAsDriver(PLAYER_PED, storeCarCharIsInNoSave(PLAYER_PED))
        stop=1
        end)
    wait(-1)
end
--honk after 8!

function metal()
    for m=0, 14 do
        getcoords(m)
        driver(x,y,z,speed,mode,m)
    end

--reached unload point

taskWarpCharIntoCarAsDriver(PLAYER_PED, storeCarCharIsInNoSave(PLAYER_PED))
end

function driver(x, y, z, speed, mode, n)
    taskCarDriveToCoord(PLAYER_PED, storeCarCharIsInNoSave(PLAYER_PED), x, y, z, speed, mode, 0, 2)
    sampAddChatMessage("Position "..m,0)
end

function getcoords(n)
    if n==0 then x=1163.07
    y=1870.80
    z=10.26
    speed=80
    mode=2
    elseif n==1 then x=1205.56
    y=1764.88
    z=7.38
    speed=80
    mode=2
    elseif n==2 then x=1206.26
    y=1018.06
    z=7.45
    speed=80
    mode=0
    elseif n==3 then x=1186.60
    y=945.81
    z=9.48
    speed=80
    mode=2
    elseif n==4 then x=1128.78
    y=870.00
    z=11.40
    speed=80
    mode=2
    elseif n==5 then x=5.58
    y=653.89
    z=8.61
    speed=80
    mode=0
    elseif n==6 then x=-116.94
    y=617.20
    z=2.95
    speed=80
    mode=2
    elseif n==7 then x=-128.92
    y=578.28
    z=3.44
    speed=40
    mode=2
    elseif n==8 then x=-142.37
    y=478.95
    z=12.65
    speed=40
    mode=2
    --honk after this
    elseif n==9 then x=-199.33
    y=256.43
    z=12.71
    speed=80
    mode=2
    elseif n==10 then x=-237.06
    y=172.24
    z=6.11
    speed=80
    mode=2
    elseif n==11 then x=-305.81
    y=-38.65
    z=1.72
    speed=80
    mode=2
    elseif n==12 then x=-156.43
    y=-370.78
    z=1.71
    speed=80
    mode=0
    elseif n==13 then x=-121.12
    y=-351.74
    z=2.06
    speed=40
    mode=2
    elseif n==14 then x=-117.36
    y=-328.03
    z=2.06
    speed=20
    mode=2
    end
end
 

neverlane

t.me/neverlane00
Друг
997
1,132
суть в чём, хочу написать бота, который будет ездить по массиву из меток. и я его даже уже почти написал, если бы не одна проблемка. я не знаю, как заставить скрипт ждать, пока бот не приедет на очередной чекпоинт, перед тем, как ехать на следующий (чекпоинт = квадратная зона 20x20 вокруг координат). wait работает только в main, а у меня бот активируется функцией по команде... в общем, вот говнокод, помогите чем-нибудь.

Lua:
stop=0
m=0
x=0
y=0
z=0
function main()
    repeat wait(0) until isSampAvailable()
    sampRegisterChatCommand("metal.go", metal)
    sampAddChatMessage("MetallolomShit loaded", 0)
    sampRegisterChatCommand("metal.stop", function()
        taskWarpCharIntoCarAsDriver(PLAYER_PED, storeCarCharIsInNoSave(PLAYER_PED))
        stop=1
        end)
    wait(-1)
end
--honk after 8!

function metal()
    for m=0, 14 do
        getcoords(m)
        driver(x,y,z,speed,mode,m)
    end

--reached unload point

taskWarpCharIntoCarAsDriver(PLAYER_PED, storeCarCharIsInNoSave(PLAYER_PED))
end

function driver(x, y, z, speed, mode, n)
    taskCarDriveToCoord(PLAYER_PED, storeCarCharIsInNoSave(PLAYER_PED), x, y, z, speed, mode, 0, 2)
    sampAddChatMessage("Position "..m,0)
end

function getcoords(n)
    if n==0 then x=1163.07
    y=1870.80
    z=10.26
    speed=80
    mode=2
    elseif n==1 then x=1205.56
    y=1764.88
    z=7.38
    speed=80
    mode=2
    elseif n==2 then x=1206.26
    y=1018.06
    z=7.45
    speed=80
    mode=0
    elseif n==3 then x=1186.60
    y=945.81
    z=9.48
    speed=80
    mode=2
    elseif n==4 then x=1128.78
    y=870.00
    z=11.40
    speed=80
    mode=2
    elseif n==5 then x=5.58
    y=653.89
    z=8.61
    speed=80
    mode=0
    elseif n==6 then x=-116.94
    y=617.20
    z=2.95
    speed=80
    mode=2
    elseif n==7 then x=-128.92
    y=578.28
    z=3.44
    speed=40
    mode=2
    elseif n==8 then x=-142.37
    y=478.95
    z=12.65
    speed=40
    mode=2
    --honk after this
    elseif n==9 then x=-199.33
    y=256.43
    z=12.71
    speed=80
    mode=2
    elseif n==10 then x=-237.06
    y=172.24
    z=6.11
    speed=80
    mode=2
    elseif n==11 then x=-305.81
    y=-38.65
    z=1.72
    speed=80
    mode=2
    elseif n==12 then x=-156.43
    y=-370.78
    z=1.71
    speed=80
    mode=0
    elseif n==13 then x=-121.12
    y=-351.74
    z=2.06
    speed=40
    mode=2
    elseif n==14 then x=-117.36
    y=-328.03
    z=2.06
    speed=20
    mode=2
    end
end
или делай переменную для включения/выключения бота и в беск. цикле обрабатывай либо по команде вызывай поток
Lua:
stop=0
m=0
x=0
y=0
z=0
function main()
    repeat wait(0) until isSampAvailable()
    sampRegisterChatCommand("metal.go", function()
        metal_thr:run()
    end)
    sampAddChatMessage("MetallolomShit loaded", 0)
    sampRegisterChatCommand("metal.stop", function()
        taskWarpCharIntoCarAsDriver(PLAYER_PED, storeCarCharIsInNoSave(PLAYER_PED))
        stop=1
        end)
    wait(-1)
end
--honk after 8!

function metal()
    for m=0, 14 do
        getcoords(m)
        driver(x,y,z,speed,mode,m)
    end

--reached unload point

taskWarpCharIntoCarAsDriver(PLAYER_PED, storeCarCharIsInNoSave(PLAYER_PED))
end

metal_thr = lua_thread.create_suspended(metal)

function driver(x, y, z, speed, mode, n)
    taskCarDriveToCoord(PLAYER_PED, storeCarCharIsInNoSave(PLAYER_PED), x, y, z, speed, mode, 0, 2)
    sampAddChatMessage("Position "..m,0)
end

function getcoords(n)
    if n==0 then x=1163.07
    y=1870.80
    z=10.26
    speed=80
    mode=2
    elseif n==1 then x=1205.56
    y=1764.88
    z=7.38
    speed=80
    mode=2
    elseif n==2 then x=1206.26
    y=1018.06
    z=7.45
    speed=80
    mode=0
    elseif n==3 then x=1186.60
    y=945.81
    z=9.48
    speed=80
    mode=2
    elseif n==4 then x=1128.78
    y=870.00
    z=11.40
    speed=80
    mode=2
    elseif n==5 then x=5.58
    y=653.89
    z=8.61
    speed=80
    mode=0
    elseif n==6 then x=-116.94
    y=617.20
    z=2.95
    speed=80
    mode=2
    elseif n==7 then x=-128.92
    y=578.28
    z=3.44
    speed=40
    mode=2
    elseif n==8 then x=-142.37
    y=478.95
    z=12.65
    speed=40
    mode=2
    --honk after this
    elseif n==9 then x=-199.33
    y=256.43
    z=12.71
    speed=80
    mode=2
    elseif n==10 then x=-237.06
    y=172.24
    z=6.11
    speed=80
    mode=2
    elseif n==11 then x=-305.81
    y=-38.65
    z=1.72
    speed=80
    mode=2
    elseif n==12 then x=-156.43
    y=-370.78
    z=1.71
    speed=80
    mode=0
    elseif n==13 then x=-121.12
    y=-351.74
    z=2.06
    speed=40
    mode=2
    elseif n==14 then x=-117.36
    y=-328.03
    z=2.06
    speed=20
    mode=2
    end
end
 
  • Нравится
Реакции: БеzликиЙ

McLore

Известный
559
279
Посмотреть вложение 73242Посмотреть вложение 73243
;0
Lua:
for i = 400, 610 do
    imgui.Image(VehicleImages[i], imgui.ImVec2(140, 85))
    imgui.Separator()
end
Если тебе нужен пример как реализовать данную систему, можешь почекать у меня в подпиши есть skinc, сделаешь аналогию для авто
 
  • Нравится
Реакции: Dmitriy Makarov

ZAKO

Известный
43
25
Чуваки м чуваши, накиньте функцию, которая статус дверей авто кидает.
Открыты/закрыты