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

paulohardy

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

_razor

t.me/sssecretway | ТГК: t.me/razor_code
Всефорумный модератор
1,952
3,223
  • Нравится
Реакции: Izvinisb

Eugene Crabs

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

paulohardy

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

#Rewzeisch

Известный
120
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,474
439
сервер это 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))

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

paulohardy

вы еще постите говно? тогда я иду к вам
Всефорумный модератор
1,919
1,290
(select(2, sampGetPlayerIdByCharHandle(PLAYER_PED))

Что эта строчка делает скажите плиз
sampGetPlayerIdByCharHandle возвращает два значения, select и 2 после скобки - выбирает второе значение
 

Warflex

Участник
158
17
Lua:
function arm()
    local armour = sampGetPlayerArmor(select(2, sampGetPlayerIdByCharHandle(PLAYER_PED))
    if armour == 0 then
        sampSendChat("/me достав из сумки бронежилет надел его на себя")
        sampSendChat("/armour")
    else
        sampSendChat("/me сняв бронежилет выкинул его в сторону")
        sampSendChat("/armour")
        end
    end
end

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

трабл 2-3 строка тут
 
Последнее редактирование:
  • Ха-ха
Реакции: Izvinisb