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

Evgeniy_orb

Новичок
17
3
протести как вот это работает, в блокноте писал, и удали предыдущие сообщения чтоб тему не засорять
Lua:
local rangs = {
  {1, 3, 2},
  {4, 6, 3},
  {7, 10, 5},
  {11, 14, 7}
}

local RangGive = tonumber(arg2)

for k, v in ipairs(rangs) do
    if RangGive >= v[1] and RangGive <= v[2] then
        nextday = timer+v[3]*24*60*60
    end
end

Lua:
if RangGive >= 1 and RangGive <= 3 then
                nextday = timer+2*24*60*60
            elseif RangGive >= 4 and RangGive <= 6 then
                nextday = timer+3*24*60*60
            elseif RangGive >= 7 and RangGive <= 10 then
                nextday = timer+5*24*60*60
            elseif RangGive >= 11 and RangGive <= 14 then
                nextday = timer+7*24*60*60
            end
Я по твоему совету сделал заменил or на and и все норм стало, спасибо)
Лайк к сожалению не поставлю на пост ибо ты его снес.
 
  • Bug
Реакции: qdIbp

MrDorlik

Известный
957
384
Lua:
if RangGive >= 1 and RangGive <= 3 then
                nextday = timer+2*24*60*60
            elseif RangGive >= 4 and RangGive <= 6 then
                nextday = timer+3*24*60*60
            elseif RangGive >= 7 and RangGive <= 10 then
                nextday = timer+5*24*60*60
            elseif RangGive >= 11 and RangGive <= 14 then
                nextday = timer+7*24*60*60
            end
Я по твоему совету сделал заменил or на and и все норм стало, спасибо)
Лайк к сожалению не поставлю на пост ибо ты его снес.
ну мне через таблицы больше нравится, красивее) и тебе советую научиться, полезная штука
 
  • Нравится
Реакции: Evgeniy_orb

Дядя Энрик.

Активный
336
81
не хочет перебирать список игроков

Lua:
--начало
local now_recon_lvl = {}
local now_recon = 1
--frame
imgui.Text(u8(now_recon..' из '..#now_recon_lvl), imgui.SetCursorPos(imgui.ImVec2(240, 30)))
--где-то в коде.
function get_players_lvl(lvl)
    now_recon_lvl = {}
    for i = 0, sampGetMaxPlayerId(false) do
        if sampGetPlayerScore(i) == lvl then
            now_recon_lvl[#now_recon_lvl+1] = i
        end
    end
end

sampRegisterChatCommand("relvl", function(lvl)
    if not sampIsPlayerConnected(0) or sampGetPlayerScore(0) ~= tonumber(lvl) then
        for i = 0, sampGetMaxPlayerId(false), 1 do
            if sampIsPlayerConnected(i) and sampGetPlayerScore(i) == tonumber(lvl) and i ~= idspec then
                lvl = tonumber(arg) or 1
                get_players_lvl(lvl)
                idspec = i
                ocnorelvl[0] = true
                lvlre = lvl
                specstat = true
                sampSendChat('/re '..now_recon_lvl[now_recon+1])
                break
            end
        end
    end
end)
 
  • Грустно
Реакции: qdIbp

Mico

Активный
251
48
Привет, давно с луа не работал, нужна помощь. Смотрите допустим люди написали в чат:
Репорт от Anton_Anton [23]: привет
Репорт от Anton_Anton1 [24]: привет
Репорт от Anton_Anton2 [3]: привет
Нужно, чтобы скрипт поймал сообщение привет именно первого игрока который написал, и отобразилось в имгуи окне допустим это)
 

nanobrick

Участник
76
47
Привет, давно с луа не работал, нужна помощь. Смотрите допустим люди написали в чат:
Репорт от Anton_Anton [23]: привет
Репорт от Anton_Anton1 [24]: привет
Репорт от Anton_Anton2 [3]: привет
Нужно, чтобы скрипт поймал сообщение привет именно первого игрока который написал, и отобразилось в имгуи окне допустим это)
Lua:
local nick
local msg = 'привет'
require('lib.samp.events').onServerMessage = function(clr, text)
    if not nick then
        nick = text:match('Репорт от (%w+_%w+) %[%d+%]: ' .. msg)
    end
end

-- onframe
imgui.Text((nick or 'no winner'))
if imgui.Button('Reset') then
    nick = nil
end

к msg можешь сделать инпут чтобы прямо в игре изменять промпт. Только еще найди и докинь функцию rlower на текст в хуке чтобы капс игнорировать
 
Последнее редактирование:
  • Нравится
Реакции: Mico

Ifadee

Потрачен
5
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Как написать, чтобы перс двигался от одной позиции к другой, как обыкновенный игрок чтобы шел
 

chromiusj

прогресс невозможен без пива
Модератор
5,551
3,866
Как написать, чтобы перс двигался от одной позиции к другой, как обыкновенный игрок чтобы шел
гугл забанили видимо
1000017089.jpg
 
  • Нравится
Реакции: MLycoris

MrDorlik

Известный
957
384
Мне все еще нужна помощь, пожалуйста, помогите мне кто-нибудь.
не знал что addBlipForChar создает именно такой маркер
Lua:
local markers = {}
function main()
    while not isSampAvailable() do wait(0) end
    sampRegisterChatCommand('gibp', function (id)
        local res, ped = sampGetCharHandleBySampPlayerId(id)
        if res then
            local marker = addBlipForChar(ped)
            markers[id] = marker
        end
    end)
    sampRegisterChatCommand('delbp', function (id)
        local marker = markers[id]
        if marker then
            removeBlip(marker)
            markers[id] = nil
        end
    end)
    while true do
        wait(0)
    end
end
 

Evgeniy_orb

Новичок
17
3
Кто то может подсказать как эту фигню считать с чатлога?
{6AB1FF}[||||{FFFFFF}||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||] 4.73
Причем первый цвет обычно не двигается а вот этот {FFFFFF} двигается, причем в сторону конца, необходимо как то отлавливать это и считывать + дробное число на конце.
 

nanobrick

Участник
76
47
Кто то может подсказать как эту фигню считать с чатлога?
{6AB1FF}[||||{FFFFFF}||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||] 4.73
Причем первый цвет обычно не двигается а вот этот {FFFFFF} двигается, причем в сторону конца, необходимо как то отлавливать это и считывать + дробное число на конце.
Lua:
str = '{6AB1FF}[||||{FFFFFF}||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||] 4.73'
fofo = str:match('%d+%.%d+')
 
  • Нравится
Реакции: Evgeniy_orb

владикс

Потрачен
535
184
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Как изменить кватернион incar? Через синхру пробовал , не меняется
*Мб не так как-то пытался изменить через синхру, закиньте как правильно нужно
 
Последнее редактирование:
  • Bug
Реакции: MrDorlik

Rice.

Известный
Модератор
1,753
1,614
Как изменить кватернион incar? Через синхру пробовал , не меняется
*Мб не так как-то пытался изменить через синхру, закиньте как правильно нужно
Зависит от того, хочешь ли ты поменять визуально, либо на сервере.