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

Warflex

Участник
158
17
Тебя чем мой код не устроил? Твой хук в функции в проверке - говно, задержек и потока нет - говно, твой код говно. Разницы между getCharArmour и sampGetPlayerArmor в твоем случае нет
Мне не нужна задержка ты это понимаешь? Ты говоришь что твой код гуд, хоть там нету end + даже если он там и будет скрипт крашит
 

Izvinisb

Известный
Проверенный
964
598
Мне не нужна задержка ты это понимаешь? Ты говоришь что твой код гуд, хоть там нету end + даже если он там и будет скрипт крашит
Там достаточно было end в конце доставить и поставить одну скобку, все работает. /mask
Lua:
local sampev = require 'lib.samp.events'

function main()
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand('mask', arm)
    wait(-1)
end

function arm()
    lua_thread.create(function()
        local armour = sampGetPlayerArmor(select(2, sampGetPlayerIdByCharHandle(PLAYER_PED)))
        if armour == 0 then
            sampSendChat("/me достав из сумки бронежилет надел его на себя")
            wait(500)
            sampSendChat("/armour")
        else
            sampSendChat("/me сняв бронежилет выкинул его в сторону")
            wait(500)
            sampSendChat("/armour")
        end
    end)
end

function sampev.onServerMessage(color, text)
    if text:find("Вы надели бронежилет. Используйте /armour чтобы снять его или надеть ещё раз.") then
        return false
    end
end
 
Последнее редактирование:

paulohardy

вы еще постите говно? тогда я иду к вам
Всефорумный модератор
1,891
1,254
хоть там нету end
я исправил это еще до того, как ты оставил свое сообщение
Мне не нужна задержка ты это понимаешь?
1. ты нигде не говорил про то, что задержка не нужна
2. задержка НУЖНА, потому что сервер может не пропустить сообщение из-за системы анти флуда
даже если он там и будет скрипт крашит
не будет
 

Eugene Crabs

Активный
544
30
Ребят, появился старый вопрос. Функция "processLineOfSight ". Мне из неё надо достать хэндл объекта, с которым произошло столкновение. В моем случае - это персонаж. Как это сделать?
 

paulohardy

вы еще постите говно? тогда я иду к вам
Всефорумный модератор
1,891
1,254
Ребят, появился старый вопрос. Функция "processLineOfSight ". Мне из неё надо достать хэндл объекта, с которым произошло столкновение. В моем случае - это персонаж. Как это сделать?
result, ptable = processLineOfSight(аргументы)
выводи в чат ptable.entityType и сделай проверку через игрока, то, что выведет в чат перенеси в проверку. допустим entityType будет == "ped"
result, ptable = processLineOfSight(аргументы) if result and ptable.entityType = "ped" then handle = ptable.entity
 
  • Нравится
Реакции: Eugene Crabs и _raz0r

#Rewzeisch

Известный
121
10
Как сделать так чтобы активный аудиопоток после сворачивания и разворачивания не пропадал сам по себе?
 

Eugene Crabs

Активный
544
30
result, ptable = processLineOfSight(аргументы)
выводи в чат ptable.entityType и сделай проверку через игрока, то, что выведет в чат перенеси в проверку. допустим entityType будет == "ped"
result, ptable = processLineOfSight(аргументы) if result and ptable.entityType = "ped" then handle = ptable.entity
Чутка неправильно. Вроде как только что нашел решение проблемы. Этот handle надо провести через "Ped handle = getCharPointerHandle(uint ptr)". Но все равно спасибо за помощь

p.s. Выдает 1, если провести линию через персонажа игрока (playerPed). Щас с другими проверю, напишу ниже в этом сообщении для будущих поколений для поисковика.
p.p.s. Да, выдает правильный хэндл. Странно то, что раньше это не работало...
 

Tema05

Известный
1,442
401
сервер это VPS/VDS, сервер (который будет обрабатывать запросы) можно на любом языке написать
То есть есть некий сервер куда lua скрипт может отправить данные. Под сервером может подразумеваться файл на хостинге?
 

Warflex

Участник
158
17
как игнорировать сразу 2 разные строки? И они могут быть не вместе
 

suumer

Участник
31
0
Почему - то разом отображаются все окна

Форматирование (BB-код):
local main_window_state = imgui.ImBool()
local work = imgui.ImBool()

function main()
    imgui.Process = false
    while true do
    wait(0)
        if isKeyJustPressed(VK_Q) then
            work.v = not work.v
            imgui.Process = work.v
        end
        if isKeyJustPressed(VK_F2) then
            main_window_state.v = not main_window_state.v
            imgui.Process = main_window_state.v
        end
        if main_window_state.v == false then
            imgui.Process = false
        end
        if work.v == false then
            imgui.Process = false
        end
    end
end

function imgui.OnDrawFrame()
    if main_window_state.v then
        local sw, sh = getScreenResolution()
        imgui.SetNextWindowSize(imgui.ImVec2(400, 250))
        imgui.SetNextWindowPos(imgui.ImVec2(sw / 2, sh / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
        --========================================================================--
          imgui.Begin(u8"[Medical Helper] Панель управления (v"..version..")", main_window_state, imgui.WindowFlags.NoResize + imgui.WindowFlags.NoMove + imgui.WindowFlags.NoCollapse)
        if imgui.CollapsingHeader(u8"1. Список доступных команд", imgui.ImVec2(-0.1, 0)) then
            imgui.Text(u8"[1] - /med - Выдать медицинскую карту\n[2] - /inject - Сделать укол пациенту\n[3] - /donor - Взять кровь на донорство\n[4] - Alt + 1 - Вылечить пациента\n[5] - Numpad 0 - Поприветствовать и поинтересоваться")
        end
        imgui.End()
    end
    if work.v then
        imgui.Begin(u8"11111", work, imgui.WindowFlags.NoResize + imgui.WindowFlags.NoMove + imgui.WindowFlags.NoCollapse)
        if imgui.Button(u8"Выгнать", imgui.ImVec2(95, 25)) then
            lua_thread.create(function()
                 sampSendChat("/do Человек лежит на полу.")
            end)
        end
        imgui.End()
    end
end
 
Последнее редактирование:

Warflex

Участник
158
17
(select(2, sampGetPlayerIdByCharHandle(PLAYER_PED))

Что эта строчка делает скажите плиз