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

Joni Scripts

Известный
535
374
Как проверить прицеплен ли прицеп к тягачу? Дайте желательно кодом а не просто функцией, с получением всех значений для isTrailerAttachedToCab
 
  • Нравится
Реакции: Quit

T1cKz

Известный
595
245
Делал проход по скрипту, и что бы он отправил инфу серверу, нужно название сервера.
Делал через:
Lua:
while not sampGetCurrentServerName() do wait(0) end
Но почему-то у некоторых он умудрился пройти ещё до коннекта к серверу. А теперь вопрос. Как он получил название? И какое он получает название? Я так понимаю это nil, но почему название было получено ещё до коннекта? Может это какой-то софт с этим связан? Т.к. ставить миллион проверок для авторизации, это дико
 

~Justie~

Участник
133
25
Делал проход по скрипту, и что бы он отправил инфу серверу, нужно название сервера.
Делал через:
Lua:
while not sampGetCurrentServerName() do wait(0) end
Но почему-то у некоторых он умудрился пройти ещё до коннекта к серверу. А теперь вопрос. Как он получил название? И какое он получает название? Я так понимаю это nil, но почему название было получено ещё до коннекта? Может это какой-то софт с этим связан? Т.к. ставить миллион проверок для авторизации, это дико
чет ты неправильно используешь эту функцию
1585760932677.png
 

T1cKz

Известный
595
245
чет ты неправильно используешь эту функцию
Посмотреть вложение 52320
Если коннект не прошёл, и ты его юзнёшь при загрузке в main когда ещё не зашёл на сервер, например он полный, он не выдаст тебе название сервера, он вернёт nil, и если её использовать так, он не пустит дальше пока не получит названия хоть какого-то
 

Xyi znaet

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

Di3

Участник
432
20
Lua:
settings = inicfg.load({
    set = {
        colorstone = 16777215,
    }
},'config')

colorstone = imgui.ImColor(settings.set.colorstone)
-- Где то в начале --


if imgui.ColorEdit3(u8"Цвет##123", colorstone.v) then
        settings.set.colorstone = colorstone:GetU32()

end
-- Где то внутри кода --

r, g, b, a = imgui.ImColor(settings.set.colorstone):GetRGBA()
color = join_argb(a, r, g, b);
renderDrawPolygon(x, y, 5, 5, 8, 0.0, rcolor)
renderDrawLine(x, y, xp, yp, 2.0, rcolor)
renderFontDrawText(font,Текст,x,y,rcolor)

-- В цикле --

Почему не рисует из-за цвета?

Есть аналогичные функции с трейсерами, все работает отлично.
 

paulohardy

вы еще постите говно? тогда я иду к вам
Всефорумный модератор
1,909
1,286
Создай некий компилятор по сайту, декомпил не берет который тут на форуме, но и гташка не принимает, можно как-то сделать?

[ML] (error) binder_servers.luac: D:\Dsamp\moonloader\binder_servers.luac: cannot load incompatible bytecode
[ML] (error) binder_servers.luac: Script died due to an error. (0191D854)

Посмотреть вложение 52318
Для муна есть свой компилятор и он уже есть на форуме
 

черный кот

Известный
167
184
while not sampIsDialogActive() do wait(0) end
Это будет выполняться до того момента как появится диалог
че т не работает

Вот это у меня в потоке:
test:
sampSendChat("/hui")
wait(200)
sampSendDialogResponse(228, 1, 1, 0)
wait(200)
sampSendDialogResponse(322, 1, 0 0)
wait(200)
sampSendDialogResponse(1337, 1, 0, 0)
wait(200)
sampSendDialogResponse(999, 0, 0, 0)

Как мне правильнее заменить wait?
 
Последнее редактирование:

Di3

Участник
432
20
че т не работает

Вот это у меня в потоке:
test:
sampSendChat("/hui")
wait(200)
sampSendDialogResponse(228, 1, 1, 0)
wait(200)
sampSendDialogResponse(322, 1, 0 0)
wait(200)
sampSendDialogResponse(1337, 1, 0, 0)
wait(200)
sampSendDialogResponse(999, 0, 0, 0)

Как мне правильнее заменить wait?

Перехватывай диалог и отправляй.


Lua:
local  SE = require 'lib.samp.events'
-- начало




function SE.onShowDialog(c1,c2,c3,c4,c5,c6)

if c1 == 228 then
  sampSendDialogResponse(228, 1, 1, 0)
end


if c1 == 322 then
  sampSendDialogResponse(322, 1, 0 0)
end

if c1 == 1337 then
  sampSendDialogResponse(1337, 1, 0, 0)
end

end
 

черный кот

Известный
167
184
Перехватывай диалог и отправляй.


Lua:
local  SE = require 'lib.samp.events'
-- начало




function SE.onShowDialog(c1,c2,c3,c4,c5,c6)

if c1 == 228 then
  sampSendDialogResponse(228, 1, 1, 0)
end


if c1 == 322 then
  sampSendDialogResponse(322, 1, 0 0)
end

if c1 == 1337 then
  sampSendDialogResponse(1337, 1, 0, 0)
end

end

а как мне это тогда связать с функцией, которая выполняется по команде?