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

enyag

Известный
345
12
как сделать через рендер такое закруглённое?
1597845358141.png
 

Мира

Участник
455
9
Lua:
function samp.onServerMessage(color, text)
    if text:find('{50a532}%>% {FFFFFF}{4582a1}(.+){FFFFFF} принял предложение трудоустройства в бизнес.') then
        name = text:match('{50a532}%>% {FFFFFF}{4582a1}(.+){FFFFFF} принял предложение трудоустройства в бизнес.')
        local id = idbynick(name)
        if id ~= nil and id ~= -1 then
            lua_thread.create(function()
                wait(0)
                sampSendChat("/pm "..id.." тест")
            end)
        end
    end
end

function idbynick(nick)
    for i = 0, sampGetMaxPlayerId() do
        if sampIsPlayerConnected(i) then
            if sampGetPlayerNickname(i) == nick then
                id = i
            end
        end
    end
    local i = id
    id = nil
    return i == nil and -1 or i
end
почему не работает?
мне кажется проблема где-то здесь
if text:find('{50a532}%>% {FFFFFF}{4582a1}(.+){FFFFFF}
 

Anton Nixon

Известный
474
48
Lua:
function samp.onServerMessage(color, text)
    if text:find('{50a532}%>% {FFFFFF}{4582a1}(.+){FFFFFF} принял предложение трудоустройства в бизнес.') then
        name = text:match('{50a532}%>% {FFFFFF}{4582a1}(.+){FFFFFF} принял предложение трудоустройства в бизнес.')
        local id = idbynick(name)
        if id ~= nil and id ~= -1 then
            lua_thread.create(function()
                wait(0)
                sampSendChat("/pm "..id.." тест")
            end)
        end
    end
end

function idbynick(nick)
    for i = 0, sampGetMaxPlayerId() do
        if sampIsPlayerConnected(i) then
            if sampGetPlayerNickname(i) == nick then
                id = i
            end
        end
    end
    local i = id
    id = nil
    return i == nil and -1 or i
end
почему не работает?
мне кажется проблема где-то здесь
if text:find('{50a532}%>% {FFFFFF}{4582a1}(.+){FFFFFF}
изначальную строчку откуда искать будешь покажи
 
  • Нравится
Реакции: Мира

Мира

Участник
455
9
изначальную строчку откуда искать будешь покажи
[18:58:20] {50a532}> {FFFFFF}{4582a1}Ethan Questberry{FFFFFF} принял предложение трудоустройства в бизнес.

вот ещё локалы, которые у меня есть
Lua:
local samp = require "samp.events"
local sampev = require "lib.samp.events"
local ev = require 'lib.samp.events'
 

Fott

Простреленный
3,467
2,385
Lua:
function samp.onServerMessage(color, text)
    if text:find('{50a532}%>% {FFFFFF}{4582a1}(.+){FFFFFF} принял предложение трудоустройства в бизнес.') then
        name = text:match('{50a532}%>% {FFFFFF}{4582a1}(.+){FFFFFF} принял предложение трудоустройства в бизнес.')
        local id = idbynick(name)
        if id ~= nil and id ~= -1 then
            lua_thread.create(function()
                wait(0)
                sampSendChat("/pm "..id.." тест")
            end)
        end
    end
end

function idbynick(nick)
    for i = 0, sampGetMaxPlayerId() do
        if sampIsPlayerConnected(i) then
            if sampGetPlayerNickname(i) == nick then
                id = i
            end
        end
    end
    local i = id
    id = nil
    return i == nil and -1 or i
end
почему не работает?
мне кажется проблема где-то здесь
if text:find('{50a532}%>% {FFFFFF}{4582a1}(.+){FFFFFF}
Кажется это не вся строка из чатлога, потому что сомневаюсь что сервер установил дважды цвет на ник
Lua:
%{50a532%}%> %{FFFFFF%}%{4582a1%}(.+)%{FFFFFF%} принял предложение трудоустройства в бизнес.
 

Anton Nixon

Известный
474
48
[18:58:20] {50a532}> {FFFFFF}{4582a1}Ethan Questberry{FFFFFF} принял предложение трудоустройства в бизнес.

вот ещё локалы, которые у меня есть
Lua:
local samp = require "samp.events"
local sampev = require "lib.samp.events"
local ev = require 'lib.samp.events'
попробуй заменить на это:
Lua:
if text:find('%> (.+) .+') then
    name = text:match('%> (.+)  .+')
 

Мира

Участник
455
9
Кажется это не вся строка из чатлога, потому что сомневаюсь что сервер установил дважды цвет на ник
Lua:
%{50a532%}%> %{FFFFFF%}%{4582a1%}(.+)%{FFFFFF%} принял предложение трудоустройства в бизнес.
не работает и это всё что было в чатлоге
 

enyag

Известный
345
12
почему не работает 2 зв?
Lua:
local onez = renderLoadTextureFromFile("moonloader/img/1.png")
local twoz = renderLoadTextureFromFile("moonloader/img/2.png")
local triz = renderLoadTextureFromFile("moonloader/img/3.png")
local chez = renderLoadTextureFromFile("moonloader/img/4.png")
local pyaz = renderLoadTextureFromFile("moonloader/img/5.png")
local wesz = renderLoadTextureFromFile("moonloader/img/6.png")
        local wanted = memory.getuint8(0x58DB60)
            if wanted == 1 then
                renderDrawTexture(onez, 920, 480, 920, 480, 0, 0xFFFFFFFF)
            if wanted == 2 then
                renderDrawTexture(twoz, 920, 480, 920, 480, 0, 0xFFFFFFFF)
            if wanted == 3 then
                renderDrawTexture(triz, 920, 480, 920, 480, 0, 0xFFFFFFFF)
            if wanted == 4 then
                renderDrawTexture(chez, 920, 480, 920, 480, 0, 0xFFFFFFFF)
            if wanted == 5 then
                renderDrawTexture(pyaz, 920, 480, 920, 480, 0, 0xFFFFFFFF)
            if wanted == 6 then
                renderDrawTexture(wesz, 920, 480, 920, 480, 0, 0xFFFFFFFF)
                                    end
                                end
                            end
                        end
                    end
                end
            end
 

Fott

Простреленный
3,467
2,385
почему не работает 2 зв?
Lua:
local onez = renderLoadTextureFromFile("moonloader/img/1.png")

local twoz = renderLoadTextureFromFile("moonloader/img/2.png")

local triz = renderLoadTextureFromFile("moonloader/img/3.png")

local chez = renderLoadTextureFromFile("moonloader/img/4.png")

local pyaz = renderLoadTextureFromFile("moonloader/img/5.png")

local wesz = renderLoadTextureFromFile("moonloader/img/6.png")

local wanted = memory.getuint8(0x58DB60)

if wanted == 1 then
    renderDrawTexture(onez, 920, 480, 920, 480, 0, 0xFFFFFFFF)
elseif wanted == 2 then
    renderDrawTexture(twoz, 920, 480, 920, 480, 0, 0xFFFFFFFF)
elseif wanted == 3 then
    renderDrawTexture(triz, 920, 480, 920, 480, 0, 0xFFFFFFFF)
elseif wanted == 4 then
    renderDrawTexture(chez, 920, 480, 920, 480, 0, 0xFFFFFFFF)
elseif wanted == 5 then
    renderDrawTexture(pyaz, 920, 480, 920, 480, 0, 0xFFFFFFFF)
elseif wanted == 6 then
    renderDrawTexture(wesz, 920, 480, 920, 480, 0, 0xFFFFFFFF)
end
 

Anton Nixon

Известный
474
48
почему не работает 2 зв?
Lua:
local onez = renderLoadTextureFromFile("moonloader/img/1.png")
local twoz = renderLoadTextureFromFile("moonloader/img/2.png")
local triz = renderLoadTextureFromFile("moonloader/img/3.png")
local chez = renderLoadTextureFromFile("moonloader/img/4.png")
local pyaz = renderLoadTextureFromFile("moonloader/img/5.png")
local wesz = renderLoadTextureFromFile("moonloader/img/6.png")
        local wanted = memory.getuint8(0x58DB60)
            if wanted == 1 then
                renderDrawTexture(onez, 920, 480, 920, 480, 0, 0xFFFFFFFF)
            if wanted == 2 then
                renderDrawTexture(twoz, 920, 480, 920, 480, 0, 0xFFFFFFFF)
            if wanted == 3 then
                renderDrawTexture(triz, 920, 480, 920, 480, 0, 0xFFFFFFFF)
            if wanted == 4 then
                renderDrawTexture(chez, 920, 480, 920, 480, 0, 0xFFFFFFFF)
            if wanted == 5 then
                renderDrawTexture(pyaz, 920, 480, 920, 480, 0, 0xFFFFFFFF)
            if wanted == 6 then
                renderDrawTexture(wesz, 920, 480, 920, 480, 0, 0xFFFFFFFF)
                                    end
                                end
                            end
                        end
                    end
                end
            end
не правильно условие составил
 
  • Нравится
Реакции: enyag

shizzard

Участник
150
7
[/code] local combobombo1 = imgui.ImInt(0)
local combobombo = imgui.ImInt(0)
local pfbi ={u8' ', u8'Стажёр', u8'Дежурный', u8'Мл.Агент',u8'Агент DEA',u8'Агент CID',u8'Глава DEA',u8'Глава CID',u8'Инспектор FBI',u8'Зам.Директора FBI',u8'Директор FBI'}
local checkfrac ={u8' ', u8'Мэрия',u8'SAPD',u8'Медики',u8'Армия',u8'ФБР',u8'Автошкола'}
if imgui.Combo(u8'Группа похищенного',combobombo1,checkfrac,#checkfrac) then
if combobombo1.v == 5 then -- 4 так как отсчет с 0
imgui.Combo(u8'Похищенный',combobombo,pfbi,#pfbi)
end
end[/code]
хочу,чтобы если был ФБР, то выходил комбобокс похищенный, но он появляется и пропадает
Lua:
function sampev.onServerMessage(color, text)
    if text:find('{ffff00}[ADMIN]')
как сделать эту проверку правильно?
Lua:
function sampev.onServerMessage(color, text)
    if text:find('{ffff00}[ADMIN]') then
--code 
end
 

Demmy

Участник
121
22
хочу,чтобы если был ФБР, то выходил комбобокс похищенный, но он появляется и пропадает
Lua:
local combobombo1 = imgui.ImInt(0)
local combobombo = imgui.ImInt(0)
local pfbi ={u8' ', u8'Стажёр', u8'Дежурный', u8'Мл.Агент',u8'Агент DEA',u8'Агент CID',u8'Глава DEA',u8'Глава CID',u8'Инспектор FBI',u8'Зам.Директора FBI',u8'Директор FBI'}
local checkfrac ={u8' ', u8'Мэрия',u8'SAPD',u8'Медики',u8'Армия',u8'ФБР',u8'Автошкола'}
if imgui.Combo(u8'Группа похищенного',combobombo1,checkfrac,#checkfrac) then
    if combobombo1.v == 5 then -- 4 так как отсчет с 0
        if imgui.Combo(u8'Похищенный',combobombo,pfbi,#pfbi) then
        end
    end
end
Попробуй так
 

Sakura San

Известный
134
90
AutoBikeMotoRunSwimOnMaxSpeed:
script_name("AutoBicycleRunSwimOnMaxSpeed")
script_author("checkdasound")
script_version("4.0")
script_url("https://perfect-soft.net/")

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}

function main()
while true do
    wait(0)
   
        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 isCharOnFoot(playerPed) and isKeyDown(0x20) and isKeyCheckAvailable() then -- onFoot&inWater SpeedUP [[1]] --
            setGameKeyState(16, 256)
            wait(10)
            setGameKeyState(16, 0)
        elseif isCharInWater(playerPed) and isKeyDown(0x20) and isKeyCheckAvailable() then
            setGameKeyState(16, 256)
            wait(10)
            setGameKeyState(16, 0)
        end
    end
end

function isKeyCheckAvailable()
    if not isSampLoaded() then
        return true
    end
    if not isSampfuncsLoaded() then
        return not sampIsChatInputActive() and not sampIsDialogActive()
    end
    return not sampIsChatInputActive() and not sampIsDialogActive() and not isSampfuncsConsoleActive()
end
Как сделать чтобы в вертолетах тоже работало авто нажатие стрелки?
 

shizzard

Участник
150
7
Lua:
local combobombo1 = imgui.ImInt(0)
local combobombo = imgui.ImInt(0)
local pfbi ={u8' ', u8'Стажёр', u8'Дежурный', u8'Мл.Агент',u8'Агент DEA',u8'Агент CID',u8'Глава DEA',u8'Глава CID',u8'Инспектор FBI',u8'Зам.Директора FBI',u8'Директор FBI'}
local checkfrac ={u8' ', u8'Мэрия',u8'SAPD',u8'Медики',u8'Армия',u8'ФБР',u8'Автошкола'}
if imgui.Combo(u8'Группа похищенного',combobombo1,checkfrac,#checkfrac) then
    if combobombo1.v == 5 then -- 4 так как отсчет с 0
        if imgui.Combo(u8'Похищенный',combobombo,pfbi,#pfbi) then
        end
    end
end
Попробуй так
теперь вообще комбобокс не рабоатет