Вопросы по 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

Гость
У меня есть фиолетовая тема для имгуи, как её применить?
Lua:
function apply_custom_style()
    imgui.SwitchContext()
    local style = imgui.GetStyle()
    local colors = style.Colors
    local clr = imgui.Col
    local ImVec4 = imgui.ImVec4
    style.WindowRounding = 2
    style.WindowTitleAlign = imgui.ImVec2(0.5, 0.5)
    style.ChildWindowRounding = 2.0
    style.FrameRounding = 3
    style.ItemSpacing = imgui.ImVec2(5.0, 4.0)
    style.ScrollbarSize = 13.0
    style.ScrollbarRounding = 0
    style.GrabMinSize = 8.0
    style.GrabRounding = 1.0
    style.WindowPadding = imgui.ImVec2(4.0, 4.0)
    style.FramePadding = imgui.ImVec2(3.5, 3.5)
    style.ButtonTextAlign = imgui.ImVec2(0.0, 0.5)
    colors[clr.WindowBg]              = ImVec4(0.14, 0.12, 0.16, 1.00);
    colors[clr.ChildWindowBg]         = ImVec4(0.30, 0.20, 0.39, 0.00);
    colors[clr.PopupBg]               = ImVec4(0.05, 0.05, 0.10, 0.90);
    colors[clr.Border]                = ImVec4(0.89, 0.85, 0.92, 0.30);
    colors[clr.BorderShadow]          = ImVec4(0.00, 0.00, 0.00, 0.00);
    colors[clr.FrameBg]               = ImVec4(0.30, 0.20, 0.39, 1.00);
    colors[clr.FrameBgHovered]        = ImVec4(0.41, 0.19, 0.63, 0.68);
    colors[clr.FrameBgActive]         = ImVec4(0.41, 0.19, 0.63, 1.00);
    colors[clr.TitleBg]               = ImVec4(0.41, 0.19, 0.63, 0.45);
    colors[clr.TitleBgCollapsed]      = ImVec4(0.41, 0.19, 0.63, 0.35);
    colors[clr.TitleBgActive]         = ImVec4(0.41, 0.19, 0.63, 0.78);
    colors[clr.MenuBarBg]             = ImVec4(0.30, 0.20, 0.39, 0.57);
    colors[clr.ScrollbarBg]           = ImVec4(0.30, 0.20, 0.39, 1.00);
    colors[clr.ScrollbarGrab]         = ImVec4(0.41, 0.19, 0.63, 0.31);
    colors[clr.ScrollbarGrabHovered]  = ImVec4(0.41, 0.19, 0.63, 0.78);
    colors[clr.ScrollbarGrabActive]   = ImVec4(0.41, 0.19, 0.63, 1.00);
    colors[clr.ComboBg]               = ImVec4(0.30, 0.20, 0.39, 1.00);
    colors[clr.CheckMark]             = ImVec4(0.56, 0.61, 1.00, 1.00);
    colors[clr.SliderGrab]            = ImVec4(0.41, 0.19, 0.63, 0.24);
    colors[clr.SliderGrabActive]      = ImVec4(0.41, 0.19, 0.63, 1.00);
    colors[clr.Button]                = ImVec4(0.41, 0.19, 0.63, 0.44);
    colors[clr.ButtonHovered]         = ImVec4(0.41, 0.19, 0.63, 0.86);
    colors[clr.ButtonActive]          = ImVec4(0.64, 0.33, 0.94, 1.00);
    colors[clr.Header]                = ImVec4(0.41, 0.19, 0.63, 0.76);
    colors[clr.HeaderHovered]         = ImVec4(0.41, 0.19, 0.63, 0.86);
    colors[clr.HeaderActive]          = ImVec4(0.41, 0.19, 0.63, 1.00);
    colors[clr.ResizeGrip]            = ImVec4(0.41, 0.19, 0.63, 0.20);
    colors[clr.ResizeGripHovered]     = ImVec4(0.41, 0.19, 0.63, 0.78);
    colors[clr.ResizeGripActive]      = ImVec4(0.41, 0.19, 0.63, 1.00);
    colors[clr.CloseButton]           = ImVec4(1.00, 1.00, 1.00, 0.75);
    colors[clr.CloseButtonHovered]    = ImVec4(0.88, 0.74, 1.00, 0.59);
    colors[clr.CloseButtonActive]     = ImVec4(0.88, 0.85, 0.92, 1.00);
    colors[clr.PlotLines]             = ImVec4(0.89, 0.85, 0.92, 0.63);
    colors[clr.PlotLinesHovered]      = ImVec4(0.41, 0.19, 0.63, 1.00);
    colors[clr.PlotHistogram]         = ImVec4(0.89, 0.85, 0.92, 0.63);
    colors[clr.PlotHistogramHovered]  = ImVec4(0.41, 0.19, 0.63, 1.00);
    colors[clr.TextSelectedBg]        = ImVec4(0.41, 0.19, 0.63, 0.43);
    colors[clr.ModalWindowDarkening]  = ImVec4(0.20, 0.20, 0.20, 0.35);
end
apply_custom_style()
Просто вставь в любое место кода.
 
  • Нравится
Реакции: СЛожно

Pasquale Developer

Известный
109
8
Пацаны, подскажите как правильно компилировать скрипт для дропбокса с автообновлением.
 

frit

Известный
389
174
Lua:
local sampev = require 'lib.samp.events'
local f="C:\\checker\\1.txt"
local fwrite
function sampev.onServerMessage(color, text)
    if text:find("Администратор% (%w+.%w+)%[(%d+)%]% забанил игрока% (%w+.%w+)%[(%d+)%]%на % (%d+)% дней") then
        local nickadm, admid, nick, id, days = text:match("Администратор% (%w+.%w+)%[(%d+)%]% забанил игрока% (%w+.%w+)%[(%d+)%]%на % (%d+)% дней")
        fwrite = io.open(f, "a")
        fwrite:write(nick.. "забанен на ".. days)
    end
end


fwrite:close()


не получается сделать.

в консоли сампфункса:
attempt to index a nil value
stack traceback:


Script died due to an error. (2C9AE81C)
 

Dmitriy Makarov

25.05.2021
Проверенный
2,500
1,131
Пацаны, подскажите как правильно компилировать скрипт для дропбокса с автообновлением.
Заливаешь просто и все..
Если ты спрашиваешь по поводу того, с какой кодировкой, то там париться не нужно, как есть заливаешь и все
Насчет ссылки, то когда скопируешь ссылку, в конце ссылки будет "dl=0", меняешь цифру 0 на 1, чтобы получилось "dl=1".
 

Vespan

Чешский луашер
Проверенный
2,119
1,720
Дайте пожалуйста функцию которая включает анимацию по id (для всех игроков)
 

CaJlaT

07.11.2024 14:55
Модератор
2,833
2,669
Как подгружать файлы через lua
Lua:
local dlstatus = require('moonloader').download_status


--main() перед вечным циклом
if not doesFileExist("moonloader/resource/fonts/fa-solid-900.ttf") then
    sampAddChatMessage('[{fa0085}DayStats{FFFFFF}]: Шрифт не был найден, началось автоматическое скачивание, не закрывайте игру!', -1)
    download_id = downloadUrlToFile('https://github.com/FortAwesome/Font-Awesome/raw/master/webfonts/fa-solid-900.ttf', 'moonloader/resource/fonts/fa-solid-900.ttf', download_handler)
end

--В любой части кода вне других функций
function download_handler(id, status, p1, p2)
    if status == dlstatus.STATUS_ENDDOWNLOADDATA then
        sampAddChatMessage('[{fa0085}DayStats{FFFFFF}]: Скачивание успешно завершено', -1)
    end
end
 
  • Нравится
Реакции: onetap.su

astynk

Известный
Проверенный
742
532
Дайте пожалуйста функцию которая включает анимацию по id (для всех игроков)
/anim айди анимации
Lua:
sampRegisterChatCommand('anim', function (id)
        local lib, name = sampGetAnimationNameAndFile(id)
        if not hasAnimationLoaded(lib) then
            requestAnimation(lib)
        end
        if lib == '' then
            return sampAddChatMessage('LUA: Анимация с указанным ID не найдена.', 0x007FFF)
        end
        taskPlayAnim(1, name, lib, 2.0, false, false, false, true, 0)
        sampAddChatMessage('LUA: Воспроизведение анимации: {DDDDDD}' .. lib .. ' >> ' .. name .. ' {007FFF}ID{DDDDDD} ' .. id, 0x007FFF)
end)
 
  • Нравится
Реакции: Vespan

copypaste_scripter

Известный
1,261
235
Lua:
        if isCharOnFoot(playerPed) and isKeyDown(0x31) and isKeyCheckAvailable() then -- onFoot&inWater SpeedUP [[1]] --
            setGameKeyState(16, 256)
            wait(10)
            setGameKeyState(16, 0)
        elseif isCharInWater(playerPed) and isKeyDown(0x31) and isKeyCheckAvailable() then
            setGameKeyState(16, 256)
            wait(10)
            setGameKeyState(16, 0)
        end
        if isCharOnAnyBike(playerPed) and isKeyCheckAvailable() and isKeyDown(0xA0) then    -- onBike&onMoto SpeedUP [[LSHIFT]] --
            if bike[getCarModel(storeCarCharIsInNoSave(playerPed))] then
                setGameKeyState(16, 255)
                wait(10)
                setGameKeyState(16, 0)
            elseif moto[getCarModel(storeCarCharIsInNoSave(playerPed))] then
                setGameKeyState(1, -128)
                wait(10)
                setGameKeyState(1, 0)
            elseif heli[getCarModel(storeCarCharIsInNoSave(playerPed))] then
                setGameKeyState(1, -128)
                wait(10)
                setGameKeyState(1, 0)
            end
        end
короче я скопировал функцию и там было без вертолета (heli) я пытался добавить его но что-то не работает (хочу чтобы при зажатии Шифт левый сам нажимался СтрелкаВверх, как это работает на мото (moto). выше была указана ид видов тачки гта (будет ниже) и я записал там вертолетики тоже, помогите плиз :)

bike = {[481] = true, [509] = true, [510] = true}
moto = {[448] = true, [461] = true, [462] = true, [463] = true, [468] = true, [471] = true, [521] = true, [522] = true, [523] = true, [581] = true, [586] = true}
heli = {[469] = true, [487] = true, [563] = true} --417 leviathan 425 hunter 447 seasparrow 469 sparrow 487 maverick 488 san news maverick 497 police maverick 548 cargobob 563 raindance
 

frit

Известный
389
174
Lua:
local inicfg = require("inicfg")
local sampev = require("lib.samp.events")

function sampev.onServerMessage(color, text)
    if string.match(text, 'Администратор% .+ забанил игрока .+ на %d+ дней. Причина: .+') then
        local admin, player, days, reason = text:match('Администратор% .+ забанил игрока .+ на %d+ дней. Причина: .+')
        WriteMessageToFile(os.date('[%H:%M:%S | %d.%m.%Y]')..' '..player..' забанен на: ', 'logging\\checker.txt')
    end
end

function WriteMessageToFile(text, path)
    local file = io.open(getWorkingDirectory()..'\\'..path, 'a+')
    file:write(text..'\n')
    file:close()
end

что не так?
 

paulohardy

вы еще постите говно? тогда я иду к вам
Всефорумный модератор
1,908
1,284
Lua:
        if isCharOnFoot(playerPed) and isKeyDown(0x31) and isKeyCheckAvailable() then -- onFoot&inWater SpeedUP [[1]] --
            setGameKeyState(16, 256)
            wait(10)
            setGameKeyState(16, 0)
        elseif isCharInWater(playerPed) and isKeyDown(0x31) and isKeyCheckAvailable() then
            setGameKeyState(16, 256)
            wait(10)
            setGameKeyState(16, 0)
        end
        if isCharOnAnyBike(playerPed) and isKeyCheckAvailable() and isKeyDown(0xA0) then    -- onBike&onMoto SpeedUP [[LSHIFT]] --
            if bike[getCarModel(storeCarCharIsInNoSave(playerPed))] then
                setGameKeyState(16, 255)
                wait(10)
                setGameKeyState(16, 0)
            elseif moto[getCarModel(storeCarCharIsInNoSave(playerPed))] then
                setGameKeyState(1, -128)
                wait(10)
                setGameKeyState(1, 0)
            elseif heli[getCarModel(storeCarCharIsInNoSave(playerPed))] then
                setGameKeyState(1, -128)
                wait(10)
                setGameKeyState(1, 0)
            end
        end
короче я скопировал функцию и там было без вертолета (heli) я пытался добавить его но что-то не работает (хочу чтобы при зажатии Шифт левый сам нажимался СтрелкаВверх, как это работает на мото (moto). выше была указана ид видов тачки гта (будет ниже) и я записал там вертолетики тоже, помогите плиз :)

bike = {[481] = true, [509] = true, [510] = true}
moto = {[448] = true, [461] = true, [462] = true, [463] = true, [468] = true, [471] = true, [521] = true, [522] = true, [523] = true, [581] = true, [586] = true}
heli = {[469] = true, [487] = true, [563] = true} --417 leviathan 425 hunter 447 seasparrow 469 sparrow 487 maverick 488 san news maverick 497 police maverick 548 cargobob 563 raindance
У тебя проверка на нахождение в вертолете находится в проверке на нахождение в двухколесном транспорте
Lua:
        if isCharOnFoot(playerPed) and isKeyDown(0x31) and isKeyCheckAvailable() then -- onFoot&inWater SpeedUP [[1]] --
            setGameKeyState(16, 256)
            wait(10)
            setGameKeyState(16, 0)
        elseif isCharInWater(playerPed) and isKeyDown(0x31) and isKeyCheckAvailable() then
            setGameKeyState(16, 256)
            wait(10)
            setGameKeyState(16, 0)
        end
        if isCharOnAnyBike(playerPed) and isKeyCheckAvailable() and isKeyDown(0xA0) then    -- onBike&onMoto SpeedUP [[LSHIFT]] --
            if bike[getCarModel(storeCarCharIsInNoSave(playerPed))] then
                setGameKeyState(16, 255)
                wait(10)
                setGameKeyState(16, 0)
            elseif moto[getCarModel(storeCarCharIsInNoSave(playerPed))] then
                setGameKeyState(1, -128)
                wait(10)
                setGameKeyState(1, 0)
            end
        end
        if isCharInAnyHeli(1) then
            if heli[getCarModel(storeCarCharIsInNoSave(playerPed))] then
                setGameKeyState(1, -128)
                wait(10)
                setGameKeyState(1, 0)
            end
        end
 
  • Нравится
Реакции: copypaste_scripter

CaJlaT

07.11.2024 14:55
Модератор
2,833
2,669
Как удалить какой-то текст из .txt файла который я создал?
Lua:
function clear_file(path)--вызывать с помощью clear_file(полный путь до файла)
    local file = io.open(path, 'w') -- открывает файл с модификатором 'w' - перезапись
    file:write('') -- удаляет содержимое файла
    file:close() -- закрывает файл
end
 

CaJlaT

07.11.2024 14:55
Модератор
2,833
2,669
А как удалить что-то определенное?
Lua:
function clear_file(path,text_delete)--вызывать с помощью clear_file(полный путь до файла, текст для удаления)
    local file = io.open(path, 'w') -- открывает файл с модификатором 'w' - перезапись
    local text = file:read("*a") -- читает файл
    file:write(text:gsub(text_delete, '')) -- удаляет не нужное содержимое файла
    file:close() -- закрывает файл
end
 

copypaste_scripter

Известный
1,261
235
в каком месте скрипта надо вписать и каким образом чтобы каждую минуту отправлял бесконечно
Lua:
lua_thread.create(function()
    sampSendChat("/id nick_name")
    wait(60000)
end)