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

ARMOR

Я креветка
Модератор
5,068
7,426
Кто знает как написать что бы после сообщения в чат "Вы заняли" происходил принудительный кик с сервера, что бы персонажа кикнуло с сервера. Server closed the connection.

И кто может перенести функцию консоли 0afb:1 которая тебя респавнит, в Lua формат. Только не sampSpawnPlayer(), эта функция респавнит только на последнюю точку где был заспавнен персонаж а не начальную.
Опкод 0AFB: это не спавн, а смена интерьёра для персонажа, т.е смена виртуального мира.
Вот две функции с помощью которых ты мржешь менять интерьер персу
sampSendInteriorChange(int id)
setCharInterior(Ped ped, int interior)
 

Dmitriy Makarov

25.05.2021
Проверенный
2,512
1,139
Спасибо, со script_properties("work-in-pause") стало понятнее. Но вот одно из условий этой работы, чтобы игра была развернута. Можно ли как-то заставить скрипт работать ещё и тогда, когда игра свёрнута? Или как-то отловить сворачивание/разворачивание игры посредством lua?
Не знаю, что ты там хочешь сделать, но нашёл вот такую функцию:
Но я подозреваю, что это будет работать, если SAMP в оконном режиме, а не полноэкранном, хотя могу ошибаться. Других способов не знаю.
 

shtron

Новичок
4
0
Dmitriy Makarov, пытался пользоваться этим методом, но так и есть, не работает. Но скорее всего из-за того, что скрипт тоже не работает, когда игра свёрнута. Хочу другому приложению сообщать когда игра на паузе или свернута. Думал перезаписывать отдельный файл, каждый раз когда это состояние меняется, но отловить сворачивание пока не получается
 

Dmitriy Makarov

25.05.2021
Проверенный
2,512
1,139
Кто знает как написать что бы после сообщения в чат "Вы заняли" происходил принудительный кик с сервера, что бы персонажа кикнуло с сервера. Server closed the connection.
Там при первом использовании фриз 1-2 секунды. Не знаю, может я не правильно использую..
Lua:
local sampev = require 'lib.samp.events'

function sampev.onServerMessage(color, text)
    if text:find("test") then
        close_connection()
    end
end

function close_connection() -- from https://www.blast.hk/threads/13892/post-702129
    local bs = raknetNewBitStream()
    raknetBitStreamWriteInt8(bs, 32)
    raknetEmulPacketReceiveBitStream(32, bs)
    raknetDeleteBitStream(bs)
end

И кто может перенести функцию консоли 0afb:1 которая тебя респавнит, в Lua формат. Только не sampSpawnPlayer(), эта функция респавнит только на последнюю точку где был заспавнен персонаж а не начальную.
Я так использую:
Lua:
-- main
sampRegisterChatCommand("spawn", function() runSampfuncsConsoleCommand("0afb: 0") end) -- Знаю, что смена скина (судя по вики), но на АРП этот опкод спавнит
-- Если ты где-то на другом проекте, то попробуй 0af6: 0
 

shrug228

Активный
212
77
Спасибо, со script_properties("work-in-pause") стало понятнее. Но вот одно из условий этой работы, чтобы игра была развернута. Можно ли как-то заставить скрипт работать ещё и тогда, когда игра свёрнута? Или как-то отловить сворачивание/разворачивание игры посредством lua?
Отлавливай нажатие Alt+Tab, это и будет сворачиванием. А после этого продолжание работы скрипта - разворачивание.
 

shrug228

Активный
212
77
Lua:
function imgui.OnDrawFrame()
    imgui.PushStyleColor(imgui.Col.WindowBg, imgui.ImVec4(0, 0, 0, 0))
    -- дальше идет другой код, который без этого работает нормально
    -- а вот конкретно эта строчка вызыывает краш игры с ошибкой Visual C++ с причиной:
    -- PushStyleColor/PopStyleColor mismatch
 

Dmitriy Makarov

25.05.2021
Проверенный
2,512
1,139
Lua:
function imgui.OnDrawFrame()
    imgui.PushStyleColor(imgui.Col.WindowBg, imgui.ImVec4(0, 0, 0, 0))
    -- дальше идет другой код, который без этого работает нормально
    -- а вот конкретно эта строчка вызыывает краш игры с ошибкой Visual C++ с причиной:
    -- PushStyleColor/PopStyleColor mismatch
Lua:
function imgui.OnDrawFrame()
    if main_window_state.v then -- Тут твоя переменная окна.
        imgui.PushStyleColor(imgui.Col.WindowBg, imgui.ImVec4(0, 0, 0, 0))
            imgui.Begin(u8"Test script", main_window_state)
                imgui.Text("Test")
            imgui.End()
        imgui.PopStyleColor()
    end
end
Табуляцию сделал, чтобы наглядно показать, как должна выглядеть "структура", что-ли.. А так она (табуляция) там вроде необязательная, если условий нет.
Screenshot_3.png
 
  • Нравится
Реакции: shrug228

VincentBatters

Новичок
1
0
Доброго времени суток, вопрос такой. Как сделать, чтоб в окне imgui можно было выделять и копировать текст?
 

Dmitriy Makarov

25.05.2021
Проверенный
2,512
1,139
Доброго времени суток, вопрос такой. Как сделать, чтоб в окне imgui можно было выделять и копировать текст?
Насколько мне известно - никак. Я про выделение.
А так есть функция imgui.SetClipboardText(text)
Lua:
imgui.Text("Текст, который нужно скопировать")
if imgui.IsItemClicked(0) then -- Кнопка, при нажатии которой текст скопируется. (Это ЛКМ. Нужно навести на текст выше и нажать ЛКМ)
    imgui.SetClipboardText("Текст, который скопируется")
end
 
  • Влюблен
Реакции: VincentBatters

YarikVL

Известный
Проверенный
4,712
1,802
Доброго времени суток, вопрос такой. Как сделать, чтоб в окне imgui можно было выделять и копировать текст?
Lua:
imgui.TextColoredRGB("pirivet")
setClipboardText("pirivet")
Каждый кадр копирует в буфер обмена слово pirivet
 
  • Влюблен
Реакции: VincentBatters

shmit_ti

Известный
74
20
Может кто-то сделать активацию на F2 и деактивацию на кнопку Z
менял один скриптик , но работает от команды
Хотелось бы на кнопку
 

Вложения

  • HELP.txt
    1.3 KB · Просмотры: 3

kolya141

Участник
60
8
1651243332941.png
Нужно сделать клик по текстдраву 2059 но те что на экране почему-то не работают
 
Последнее редактирование: