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

Rei

Известный
Друг
1,599
1,635
Добрый день, я хочу написать простой для себя биндер буквально на несколько кнопок. У меня впринципе всё получилось, но проблема заключается в том что даже если у меня открыт чат и я ввожу текст и нажимаю на кнопку на которой стоит бинд, у меня чат закрывается и вводится команда. Как мне при открытом чате сделать так чтобы кнопки которы забинжены не работали. Я полный ноль в коддинге, но хотелось бы что-то своё сделать для себя опять же. Спасибо
КОД:

require 'moonloader'
local keys = require 'vkeys'

function main()
while not isSampAvailable() do wait(0) end

while true do
wait(0)
if isKeyDown(VK_F8) then
sampProcessChatInput('/time')
end

if isKeyDown(VK_K) then
sampProcessChatInput('/key')
end

if isKeyJustPressed(VK_L) then
sampProcessChatInput('/lock')
end

end
end
if isKeyDown(VK_F8) and not sampIsChatInputActive() and not isSampfuncsConsoleActive() then
 
  • Нравится
Реакции: sep

штейн

Известный
Проверенный
1,000
686
Добрый день, я хочу написать простой для себя биндер буквально на несколько кнопок. У меня впринципе всё получилось, но проблема заключается в том что даже если у меня открыт чат и я ввожу текст и нажимаю на кнопку на которой стоит бинд, у меня чат закрывается и вводится команда. Как мне при открытом чате сделать так чтобы кнопки которы забинжены не работали. Я полный ноль в коддинге, но хотелось бы что-то своё сделать для себя опять же. Спасибо
КОД:

require 'moonloader'
local keys = require 'vkeys'

function main()
while not isSampAvailable() do wait(0) end

while true do
wait(0)
if isKeyDown(VK_F8) then
sampProcessChatInput('/time')
end

if isKeyDown(VK_K) then
sampProcessChatInput('/key')
end

if isKeyJustPressed(VK_L) then
sampProcessChatInput('/lock')
end

end
end
Lua:
require 'moonloader'

function main()
    while not isSampAvailable() do wait(0) end
    while true do wait(0)
        if isKeyDown(VK_F8) and not sampIsChatInputActive() then
            sampSendChat('/time')
        end
        if isKeyDown(VK_K) and not sampIsChatInputActive() then
            sampProcessChatInput('/key')
        end
        if isKeyJustPressed(VK_L) and not sampIsChatInputActive() then
            sampProcessChatInput('/lock')
        end
    end
end
 

CaJlaT

Овощ
Модератор
2,809
2,623
слева такое окошко. Там где Главная, Настройки итд
Lua:
local imgui = require 'imgui'
local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8
local window = imgui.ImBool(false)
local selected = 1
function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    while true do
        wait(0)
        if testCheat('JJ') then window.v = not window.v end
        imgui.Process = window.v
    end
end
function imgui.OnDrawFrame()
    ScreenX, ScreenY = getScreenResolution()
    imgui.SetNextWindowSize(imgui.ImVec2(500, 300), imgui.Cond.FirstUseEver)
    imgui.SetNextWindowPos(imgui.ImVec2(ScreenX / 2, ScreenY / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
    imgui.Begin(u8"Тест", window)
    imgui.BeginChild('Select', imgui.ImVec2(200, -1), true)
            if imgui.Text(u8'Выберите пункт:', selected == 1) then selected = 1 end
            if imgui.Selectable(u8'Настройки', selected == 2) then selected = 2 end
            if imgui.Selectable(u8'Информация', selected == 3) then selected = 3 end
            if imgui.Selectable(u8'Что-то ещё', selected == 4) then selected = 4 end
            if imgui.Selectable(u8'Функции', selected == 5) then selected = 5 end
    imgui.EndChild()
    imgui.SameLine()
    imgui.BeginChild("Main", imgui.ImVec2(-1, -1), true)
        if selected == 1 then
        elseif selected == 2 then imgui.Text(u8'Настройки')
        elseif selected == 3 then imgui.Text(u8'Информация')
        elseif selected == 4 then imgui.Text(u8'Что-то ещё')
        elseif selected == 5 then imgui.Text(u8'Функции')
        end
    imgui.EndChild()
    imgui.End()
end
 

Вложения

  • zdarova.lua
    4.3 KB · Просмотры: 8
  • Нравится
Реакции: sep и Fott

Мира

Участник
455
9
Добрый день, я хочу написать простой для себя биндер буквально на несколько кнопок. У меня впринципе всё получилось, но проблема заключается в том что даже если у меня открыт чат и я ввожу текст и нажимаю на кнопку на которой стоит бинд, у меня чат закрывается и вводится команда. Как мне при открытом чате сделать так чтобы кнопки которые забиндены не работали.
P.s Я полный ноль в коддинге, но хотелось бы что-то своё сделать для себя опять же. Спасибо

КОД:

require 'moonloader'
local keys = require 'vkeys'

function main()
while not isSampAvailable() do wait(0) end

while true do
wait(0)
if isKeyDown(VK_F8) then
sampProcessChatInput('/time')
end

if isKeyDown(VK_K) then
sampProcessChatInput('/key')
end

if isKeyJustPressed(VK_L) then
sampProcessChatInput('/lock')
end

end
end
вот тебе как пример
Lua:
if isKeyJustPressed(106)
        and not sampIsChatInputActive()
        and not sampIsDialogActive()
        then
            sampSendChat("/usedrugs 3")
        end
 

MaksQ

Известный
967
821
Lua:
local imgui = require 'imgui'
local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8
local window = imgui.ImBool(false)
local selected = 1
function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    while true do
        wait(0)
        if testCheat('JJ') then window.v = not window.v end
        imgui.Process = window.v
    end
end
function imgui.OnDrawFrame()
    ScreenX, ScreenY = getScreenResolution()
    imgui.SetNextWindowSize(imgui.ImVec2(500, 300), imgui.Cond.FirstUseEver)
    imgui.SetNextWindowPos(imgui.ImVec2(ScreenX / 2, ScreenY / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
    imgui.Begin(u8"Тест", window)
    imgui.BeginChild('Select', imgui.ImVec2(200, -1), true)
            if imgui.Text(u8'Выберите пункт:', selected == 1) then selected = 1 end
            if imgui.Selectable(u8'Настройки', selected == 2) then selected = 2 end
            if imgui.Selectable(u8'Информация', selected == 3) then selected = 3 end
            if imgui.Selectable(u8'Что-то ещё', selected == 4) then selected = 4 end
            if imgui.Selectable(u8'Функции', selected == 5) then selected = 5 end
    imgui.EndChild()
    imgui.SameLine()
    imgui.BeginChild("Main", imgui.ImVec2(-1, -1), true)
        if selected == 1 then
        elseif selected == 2 then imgui.Text(u8'Настройки')
        elseif selected == 3 then imgui.Text(u8'Информация')
        elseif selected == 4 then imgui.Text(u8'Что-то ещё')
        elseif selected == 5 then imgui.Text(u8'Функции')
        end
    imgui.EndChild()
    imgui.End()
end
не то что надо было. там по другому все сделано
 

liwgvnqsok

Потрачен
227
125
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Lua:
require 'moonloader'

function main()
    while not isSampAvailable() do wait(0) end
    while true do wait(0)
        if isKeyDown(VK_F8) and not sampIsChatInputActive() then
            sampSendChat('/time')
        end
        if isKeyDown(VK_K) and not sampIsChatInputActive() then
            sampProcessChatInput('/key')
        end
        if isKeyJustPressed(VK_L) and not sampIsChatInputActive() then
            sampProcessChatInput('/lock')
        end
    end
end
Lua:
function main()
    repeat wait(0) until isSampAvailable()
    while true do wait(0)
        if not sampIsChatInputActive() then
            if isKeyDown(0x77) then
                sampSendChat('/time')
            end
            if isKeyDown(0x4B) then
                sampProcessChatInput('/key')
            end
            if isKeyJustPressed(0x4C) then
                sampProcessChatInput('/lock')
            end
        end
    end
end
 

Мира

Участник
455
9
хз почему, но когда пишу /leader при этом коде в чате появляется дикий флуд
Lua:
function samp.onServerMessage(color, text)
    lua_thread.create(function()
local _, id = sampGetPlayerIdByCharHandle(PLAYER_PED)
local nick = sampGetPlayerNickname(id)
if text:find('Приветствуем нового члена нашей организации (.+), которого пригласил: ' ..nick) then
   name = text:match('Приветствуем нового члена нашей организации (.+), которого пригласил: ' ..nick)
    sampSendChat('/id '..name)
    end
    if text:find('%[(%d+)%] (.+) %| (.+): (%d+)') then
         local rab = text:match('%[(%d+)%] (.+) | (.+): (%d+)')
           sampSendChat('/giverank '..rab.. ' 7')
           wait(1000)
           sampSendChat("/me обозначил место в банде")
       end
    end)
 end
1594045639371.png

почему-то во время данного флуда высвечиваются отыгровки с данного кода, бинда!
Lua:
local res, ped = getCharPlayerIsTargeting(playerHandle)
        if res then
            local proverka = isKeyJustPressed(VK_3)
            if proverka then
                res, ped = getCharPlayerIsTargeting(playerHandle)
                res, id1 = sampGetPlayerIdByCharHandle(ped)
                id2 = id1
                sampSendChat("/giverank "..id1.." 7")
                wait(1000)
                sampSendChat("/me обозначил место в банде")
            end
        end
 

sep

Известный
673
76
код:
--почему это работает

    sampRegisterChatCommand('gan', function() gan = not gan end)


    if gan then
      sampSetChatInputText("/sellgun /selldrugs  /makegun 2 50")
      sampSetChatInputEnabled(true)
      gan = false
    end
  
  
    --а это нет
  
    sampRegisterChatCommand('gan1', function(param)
      sampSetChatInputText('/sellgun /selldrugs  /makegun 2 50')
      sampSetChatInputEnabled(true)
    end)
  
    --хотя так тоже работает
  
 sampRegisterChatCommand('gan1', function(param) sampSendChat('1')  end)
 
Последнее редактирование:

CaJlaT

Овощ
Модератор
2,809
2,623
код:
--почему это работает

    sampRegisterChatCommand('gan', function() gan = not gan end)


    if gan then
      sampSetChatInputText("/sellgun /selldrugs  /makegun 2 50")
      sampSetChatInputEnabled(true)
      gan = false
    end
 
 
    --а это нет
 
    sampRegisterChatCommand('gan1', function(param)
      sampSetChatInputText('/sellgun /selldrugs  /makegun 2 50')
      sampSetChatInputEnabled(true)
    end)
 
    --хотя так тоже работает
 
sampRegisterChatCommand('gan1', function(param) sampSendChat('1')  end)
Как всегда нужно всё костылить потоками...

Lua:
sampRegisterChatCommand('gan1', function(param)
    lua_thread.create(function()
        wait(0)
        sampSetChatInputEnabled(true)
        sampSetChatInputText('/sellgun /selldrugs  /makegun 2 50')
    end)
end)
 
  • Нравится
Реакции: sep

sep

Известный
673
76
Как всегда нужно всё костылить потоками...
я понимаю что тут нельзя писать типо ты красава спасибо итд но бля ты КРАСАВА
а также все кто тут помогают таким как я , тема крутая
МОДЕР ПОЙМИ И ПРОСТИ
 
  • Ха-ха
Реакции: lemonager

Rei

Известный
Друг
1,599
1,635
Lua:
local massiv = {
{ first = 'first element 1', second = 'second element 1' },
{ first = 'first element 2', second = 'second element 2' },
{ first = 'first element 3', second = 'second element 3' }
}

print(massiv[1].second)

я могу обратиться к массиву таким образом и скрипт выведет
'second element 1'

Lua:
local massiv = {
{ 'first element 1', 'second element 1' },
{ 'first element 2', 'second element 2' },
{ 'first element 3', 'second element 3' }
}

print(massiv[1].[2])

но можно ли как-то иметь массивы без названий внутри и если да, то как обращаться к этим безымянным элементам? мой второй пример не работает
 

CaJlaT

Овощ
Модератор
2,809
2,623
Lua:
local massiv = {
{ first = 'first element 1', second = 'second element 1' },
{ first = 'first element 2', second = 'second element 2' },
{ first = 'first element 3', second = 'second element 3' }
}

print(massiv[1].second)

я могу обратиться к массиву таким образом и скрипт выведет
'second element 1'

Lua:
local massiv = {
{ 'first element 1', 'second element 1' },
{ 'first element 2', 'second element 2' },
{ 'first element 3', 'second element 3' }
}

print(massiv[1].[2])

но можно ли как-то иметь массивы без названий внутри и если да, то как обращаться к этим безымянным элементам? мой второй пример не работает
если память не изменяет, то print(massiv[1][2])
P.s: Модеры, удалите сообщение, если не так
 
  • Нравится
Реакции: Rei и sep

liwgvnqsok

Потрачен
227
125
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Lua:
local massiv = {
{ first = 'first element 1', second = 'second element 1' },
{ first = 'first element 2', second = 'second element 2' },
{ first = 'first element 3', second = 'second element 3' }
}

print(massiv[1].second)

я могу обратиться к массиву таким образом и скрипт выведет
'second element 1'

Lua:
local massiv = {
{ 'first element 1', 'second element 1' },
{ 'first element 2', 'second element 2' },
{ 'first element 3', 'second element 3' }
}

print(massiv[1].[2])

но можно ли как-то иметь массивы без названий внутри и если да, то как обращаться к этим безымянным элементам? мой второй пример не работает
Lua:
local massiv = {{ 'first element 1', 'second element 1' },{ 'first element 2', 'second element 2' }}

print(massiv[2][1]) -- return first element 2
 
  • Нравится
Реакции: Rei