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

lorgon

Известный
657
266
Как сцентрировать текст по Y внутри какого-то произвольного треугольника? Imgui/Mimgui. Шрифт не стандартный
 

Tenkara

Потрачен
380
171
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
один скрипт пишет Successfully, а в другому должно работать действие (именно скрипт пишет Successfully, а не сервер!)
попробовал с ловлей для сервера, но нихера
пример
Lua:
function ev.onDisplayGameText(style, time, text)
    lua_thread.create(function()
        if text:find("Successfully") then
            wait(5000)
            sampProcessChatInput("111")
        end
    end)
end
это он ловит серверный текст, а как мне словить текст скрипта другого?


1643036143235.png
 

SKIP_CRMP

Участник
93
8
Всем здарова. Как прочитать содержимое отправленного пакета, зная только его айди(такогог айди в евентс нету)?
 

lorgon

Известный
657
266
Как сцентрировать текст по Y внутри какого-то произвольного треугольника? Imgui/Mimgui. Шрифт не стандартный
Lua:
local height = 90 --> Высота внутри которой нужно центрировать текст

local text = "Hello"
local txtSize = imgui.CalcTextSize(text)
imgui.SetCursorPosY((height - txtSize.y) * 0.5)
imgui.Text(text)
 

SKIP_CRMP

Участник
93
8
Всем здарова. Как прочитать содержимое отправленного пакета, зная только его айди(такогог айди в евентс нету)?
 

Markelov9999

Участник
73
2
Всем привет.

Можно ли сделать по закрытию на кнопку одного окна открыть другое с подтверждением действия?
Что-то по типу такого
Lua:
if tleader.v then
    imgui.ShowCursor = true
    imgui.SetNextWindowSize(imgui.ImVec2(250, 400), imgui.Cond.FirstUseEver)
    imgui.SetNextWindowPos(imgui.ImVec2(500, 400), imgui.Cond.FirstUseEver)
    imgui.Begin(u8'Меню выдачи временного лидерства', nil, imgui.WindowFlags.NoResize)
        if imgui.Button(u8'Закрыть окно', imgui.ImVec2(225, 0)) then
            tleader = imgui.ImBool(false)
        end
            if imgui.Button(u8'Больница г. Южный', imgui.ImVec2(225, 0)) then
            tleader = imgui.ImBool(false)
            podtv.v = imgui.ImBool(true)
            imgui.ShowCursor = true
            imgui.SetNextWindowSize(imgui.ImVec2(250, 400), imgui.Cond.FirstUseEver)
            imgui.SetNextWindowPos(imgui.ImVec2(500, 400), imgui.Cond.FirstUseEver)
            imgui.Begin(u8'Подтверждение', nil, imgui.WindowFlags.NoResize)
            imgui.Text(u8'Вы действительно хотите взять временное лидерство:\n{00aaff}Больница Южный{ffffff}?')
            end
          imgui.End()
      end[\code]
 

monolith04

Известный
69
6
Есть какая-то функция в samp.events или другая где-то, когда при взятии чекпоинта (как на гонках) может выполнятся определённое действие?
 

Maidas

Известный
75
2
как сделать проверку на наличие в руках у игрока определённого оружия?
 

Markelov9999

Участник
73
2
Как можно сделать такую штуку?
Нажимаешь на пкм и при наводе на игрока его основная информация и 6 возможный действий с ним
 

Вложения

  • 1643050618295.png
    1643050618295.png
    172 KB · Просмотры: 22

chapo

🫡 В армии с 17.10.2023. В ЛС НЕ ОТВЕЧАЮ
Друг
8,763
11,198
один скрипт пишет Successfully, а в другому должно работать действие (именно скрипт пишет Successfully, а не сервер!)
попробовал с ловлей для сервера, но нихера
пример
Lua:
function ev.onDisplayGameText(style, time, text)
    lua_thread.create(function()
        if text:find("Successfully") then
            wait(5000)
            sampProcessChatInput("111")
        end
    end)
end
это он ловит серверный текст, а как мне словить текст скрипта другого?


Посмотреть вложение 133066
1. ondisplaygametext как и другие ивенты срабатывают при получении рпс от сервера, так что ты не сможешь отловить этот текст черех такой хук
2. это не геймтекст, это printstringnow, сервер не может выводить такое

как сделать проверку на наличие в руках у игрока определённого оружия?
if getCurrentCharWeapon(PLAYER_PED) == 0 then print('fist') end
 

Maidas

Известный
75
2
Как запихнуть сюда отдельные ползунки, которые будут отвечать за 1) отключение наводки аима при стане главного героя и 2) отключение наводки на уже умерших оппонентов

1643051968594.png
 

Вложения

  • AimAssist by Scar v0.7.1 Beta - Free Version.lua
    121.8 KB · Просмотры: 2

Bananious

Известный
238
17
Как мне ловить самолёт по названию AT400? Я сделал так но оно его не ловит
1643055111393.png

Lua:
function sampev.onShowDialog(id, style, title, button1, button2, text)
    if pilot_activate.v then
        for i = 0, sampGetListboxItemsCount() do
            if sampGetListboxItemText(i):find("%[%d+%].+AT400") then
                sampSendDialogResponse(1421, 1, i, nil)
            end
        end
    end
end
 

chapo

🫡 В армии с 17.10.2023. В ЛС НЕ ОТВЕЧАЮ
Друг
8,763
11,198
Как мне ловить самолёт по названию AT400? Я сделал так но оно его не ловит
Посмотреть вложение 133142
Lua:
function sampev.onShowDialog(id, style, title, button1, button2, text)
    if pilot_activate.v then
        for i = 0, sampGetListboxItemsCount() do
            if sampGetListboxItemText(i):find("%[%d+%].+AT400") then
                sampSendDialogResponse(1421, 1, i, nil)
            end
        end
    end
end
Lua:
local sampev = require 'lib.samp.events'

function sampev.onShowDialog(id, style, title, button1, button2, text)
    local line = -1
    for v in string.gmatch(text, '[^\n]+') do
        line = line + 1
        if v:find('AT400') then
            sampSendDialogResponse(id, 1, list, nil)
            sampCloseCurrentDialogWithButton(1)
        end
    end
end

Lua:
require "lib.moonloader"
local keys = require "vkeys"
local g = 'Поварежка'

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampAddChatMessage('script ebawit', 0xFFFF00)
    while true do
        wait(0)


        if  isKeyDown(0xA0) and  isKeyJustPressed(0x31) then
            sampSendChat('/armour')
            sampSendChat(g)

            if  isKeyDown(0xA0) and  isKeyJustPressed(0x32) then
                sampSendChat('/mask')
                sampSendChat(g)

                if  isKeyDown(0xA0) and  isKeyJustPressed(0x33) then
                    sampSendChat('/usedrugs 3')
                    sampSendChat(g)

                    if  isKeyJustPressed(0x4C) then
                        sampSendChat('/lock')
                     
                        if  isKeyJustPressed(0x4B) then
                            sampSendChat('/key')
                           
                            if  isKeyJustPressed(0x50) then
                                sampSendChat('/phone')
                            end
                        end
                    end
                end
            end
        end
    end
end
не работает скрипт, в чем проблема, укажите на ошибки если не сложно
пиздец...
Lua:
require "lib.moonloader"
local keys = require "vkeys"
local g = 'Поварежка'

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampAddChatMessage('script ebawit', 0xFFFF00)
    while true do
        wait(0)
        if not sampIsCursorActive() then
            if isKeyDown(0xA0) and  isKeyJustPressed(0x31) then
                sampSendChat('/armour')
                sampSendChat(g)
            end
            if  isKeyDown(0xA0) and  isKeyJustPressed(0x32) then
                sampSendChat('/mask')
                sampSendChat(g)
            end
            if  isKeyDown(0xA0) and  isKeyJustPressed(0x33) then
                sampSendChat('/usedrugs 3')
                sampSendChat(g)
            end
            if  isKeyJustPressed(0x4C) then
                sampSendChat('/lock')
            end
            if  isKeyJustPressed(0x4B) then
                sampSendChat('/key')
            end       
            if  isKeyJustPressed(0x50) then
                sampSendChat('/phone')
            end
        end         
    end
end
 

Bananious

Известный
238
17
Lua:
local sampev = require 'lib.samp.events'

function sampev.onShowDialog(id, style, title, button1, button2, text)
    local line = -1
    for v in string.gmatch(text, '[^\n]+') do
        line = line + 1
        if v:find('AT400') then
            sampSendDialogResponse(id, 1, list, nil)
            sampCloseCurrentDialogWithButton(1)
        end
    end
end


пиздец...
Lua:
require "lib.moonloader"
local keys = require "vkeys"
local g = 'Поварежка'

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampAddChatMessage('script ebawit', 0xFFFF00)
    while true do
        wait(0)
        if not sampIsCursorActive() then
            if isKeyDown(0xA0) and  isKeyJustPressed(0x31) then
                sampSendChat('/armour')
                sampSendChat(g)
            end
            if  isKeyDown(0xA0) and  isKeyJustPressed(0x32) then
                sampSendChat('/mask')
                sampSendChat(g)
            end
            if  isKeyDown(0xA0) and  isKeyJustPressed(0x33) then
                sampSendChat('/usedrugs 3')
                sampSendChat(g)
            end
            if  isKeyJustPressed(0x4C) then
                sampSendChat('/lock')
            end
            if  isKeyJustPressed(0x4B) then
                sampSendChat('/key')
            end      
            if  isKeyJustPressed(0x50) then
                sampSendChat('/phone')
            end
        end        
    end
end
Спасибо, но все равно не работает, в другом диалоговом окне где текст "[7] Телефон" работает, а где самолёты нет