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

deleted-user-204957

Гость
Добрый вечер, кто сможет привести пример, как правильно использовать findAllRandomVehiclesInSphere
 

Voldmare

Участник
19
11
Добрый день, у меня есть база ников и номеров типа: Nick_Name:123456
Как мне при при при вводе команды и ника сделать, чтоб мне показывался номер из базы данных?
 

astynk

Известный
Проверенный
742
530
Добрый день, у меня есть база ников и номеров типа: Nick_Name:123456
Как мне при при при вводе команды и ника сделать, чтоб мне показывался номер из базы данных?
В io.lines проверяешь, если строка содержит такой ник - выводишь ее.
 

gannze

Потрачен
55
3
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Как сделать вот такие вкладки в imgui
 

Вложения

  • Screenshot_10.png
    Screenshot_10.png
    10.5 KB · Просмотры: 158

Thief

Участник
108
12
Кто может как-нибудь рассказать или скинуть тему с функцией onSendPlayerSync, вообще не понимаю за что она отвечает и как с ней взаимодействовать?
 

ARI

Участник
63
11
Допустим нужно написать скрипт, который после нажатия Z будет оправлять в чат сообщение.
Вот до чего я пока додумался:
_
while true do
if isKeyJustPressed(90) == false then
wait(10)
else
wait(10)
sampAddChatMessage("worked", 0xFFFFFF)
end
end
_

Но разве это не будет сильно нагружать гта? Если такая проверка 1, наверное нет, но если таких бесконечных циклов 10?
Есть ли другой способ выполнить задачу?
Если да, то какой?
 

Oreshka23

Известный
338
164
Как сделать вот такие вкладки в imgui
Lua:
if imgui.Selectable(u8'Один', tab == 1, 0, imgui.ImVec2(200,50)) then
    tab = 1
    elseif imgui.Selectable(u8'Два', tab == 2, 0, imgui.ImVec2(200,50)) then
    tab = 2
    elseif imgui.Selectable(u8'Три', tab == 3, 0, imgui.ImVec2(200,50)) then
    tab = 3
end

imgui.BeginChild(u8'Tab', imgui.ImVec2(680, 665), true)
    if tab == 1 then
    end
imgui.EndChild()
 

NHacker1271

Известный
156
16
Как через async_http_request вывести содержимое текста на хостинге в переменную?
И правильно ли я сделал что переместил папку copas и файл copas.lua в папку либ?​
 

Thief

Участник
108
12
Допустим нужно написать скрипт, который после нажатия Z будет оправлять в чат сообщение.
Вот до чего я пока додумался:
_
while true do
if isKeyJustPressed(90) == false then
wait(10)
else
wait(10)
sampAddChatMessage("worked", 0xFFFFFF)
end
end
_

Но разве это не будет сильно нагружать гта? Если такая проверка 1, наверное нет, но если таких бесконечных циклов 10?
Есть ли другой способ выполнить задачу?
Если да, то какой?
Lua:
while true do
    wait(0)
    if isKeyJustPressed(90) then
        sampAddChatMessage("worked", 0xFFFFFF)
    end
end
Бесконечных циклов очень много в любых играх. Проверок может быть сколько угодно в цикле, это зависит от самого тебя. И зачем тебе их 10?
 

ARI

Участник
63
11
Lua:
while true do
    wait(0)
    if isKeyJustPressed(90) then
        sampAddChatMessage("worked", 0xFFFFFF)
    end
end
Бесконечных циклов очень много в любых играх. Проверок может быть сколько угодно в цикле, это зависит от самого тебя. И зачем тебе их 10?

Не думаю, что когда-нибудь мне понадобиться 10 проверок, но лучше знать будет ли игра нагружаться)
 

Thief

Участник
108
12
Не думаю, что когда-нибудь мне понадобиться 10 проверок, но лучше знать будет ли игра нагружаться)
Я не про проверки, проверок может быть сколько угодно в цикле и любой скрипт затрагивает ресурсы компьютера, даже когда в нём очень мало кода.
 

ARI

Участник
63
11
Спасите :/
Скрипт должен делать проверку и если я целюсь в игрока нажимаю Z, в чате выводится worked
Вместо этого получаю ошибку:


[15:17:20.767428] (error) hz.lua: cannot resume non-suspended coroutine
stack traceback:
[C]: in function 'getCharPlayerIsTargeting'
C:\GTA San AndreasCLEAR\moonloader\hz.lua:29: in function <C:\GTA San AndreasCLEAR\moonloader\hz.lua:21>
[15:17:20.767428] (error) hz.lua: Script died due to an error. (01B28434)

___

function main(result, id)
while not isSampAvailable() do
wait(200)
end
while true do
if isKeyDown(90) == false then
wait(10)
else
result, id = getCharPlayerIsTargeting(playerPed)
if result == true then
sampAddChatMessage("worked", 0xFFFFFF)
else
sampAddChatMessage("didn't work", 0xFFFFFF)
end
end

end

end

p.s здесь почему-то код криво отображается ( без отступов )
 

FYS

Потрачен
982
236
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Спасите :/
Скрипт должен делать проверку и если я целюсь в игрока нажимаю Z, в чате выводится worked
Вместо этого получаю ошибку:


[15:17:20.767428] (error) hz.lua: cannot resume non-suspended coroutine
stack traceback:
[C]: in function 'getCharPlayerIsTargeting'
C:\GTA San AndreasCLEAR\moonloader\hz.lua:29: in function <C:\GTA San AndreasCLEAR\moonloader\hz.lua:21>
[15:17:20.767428] (error) hz.lua: Script died due to an error. (01B28434)

___

function main(result, id)
while not isSampAvailable() do
wait(200)
end
while true do
if isKeyDown(90) == false then
wait(10)
else
result, id = getCharPlayerIsTargeting(playerPed)
if result == true then
sampAddChatMessage("worked", 0xFFFFFF)
else
sampAddChatMessage("didn't work", 0xFFFFFF)
end
end

end

end

p.s здесь почему-то код криво отображается ( без отступов )
wait(0) в беск.цикле куда делся
и зачем в main аргументы?????
 

ARI

Участник
63
11
Как получить доступ к " приватным данным ".
Например желаю узнать количество денег игрока и вывести в чат.
Для того, получиться свою сумму, мне хватит функции getPlayerMoney(), но что делать если я хочу разузнать о кошельке другого игрока, в зоне видимости.
Можно ли это вообще провернуть?