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

dmitry.karle

Известный
364
101
как отправить sampAddChatMessage 1 раз в чат? А-то он видит текст и флудит
ap , на экран выводится временный textdraw, текстдрав идёт через
Код:
if sampTextdrawIsExists() then
    text = sampTextdrawGetString()
    if text:find('(.+) ID (%d) (.+) x(%d)') then
                wplayer, wid, warning, n = text:match('(.+) ID (%d (.+) x(%d)') 
                if tonumber(n) == 1 then
                    sampAddChatMessage('WARNING: '..wplayer..' ID '..wid.. ' Категория: '..warning..' x '..n, MSG_COLOR['RED'])
                end
            end
end
после вывода textdraw'a на экран начинается флуд в чате (пока он на экране, пропадает с экрана и всё нормально), как сделать что бы отобразило 1 раз через sampAddChatMessage?
У текстдрава имеется количество, x1 x2 x3 и тд. что бы один раз вывело х1, x2 и х3
 

MrDorlik

Известный
950
383
ap , на экран выводится временный textdraw, текстдрав идёт через
Код:
if sampTextdrawIsExists() then
    text = sampTextdrawGetString()
    if text:find('(.+) ID (%d) (.+) x(%d)') then
                wplayer, wid, warning, n = text:match('(.+) ID (%d (.+) x(%d)')
                if tonumber(n) == 1 then
                    sampAddChatMessage('WARNING: '..wplayer..' ID '..wid.. ' Категория: '..warning..' x '..n, MSG_COLOR['RED'])
                end
            end
end
после вывода textdraw'a на экран начинается флуд в чате (пока он на экране, пропадает с экрана и всё нормально), как сделать что бы отобразило 1 раз через sampAddChatMessage?
У текстдрава имеется количество, x1 x2 x3 и тд. что бы один раз вывело х1, x2 и х3
Lua:
samp = require('samp.events')
function samp.onShowTextDraw(id, data)
    text = data.text
    --code
end
 

dmitry.karle

Известный
364
101
какой там string.format что бы скрыть символы в textdraw (константы в дравах)? не могу найти.
 

chromiusj

fullstack eblan
Модератор
5,795
4,094
какой там string.format что бы скрыть символы в textdraw (константы в дравах)? не могу найти.
 

kuboni

Потрачен
154
2
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
How does it move while swimming?
 

Вложения

  • auto.lua
    19.4 KB · Просмотры: 3

tsunamiqq

Участник
433
17
Lua:
function imgui.CommandsSelect(text, bool, duration, size, offsetX, color)
text = text or 'None'
color = color or COLOR_SELECT
size = size or imgui.ImVec2(900, 50)
duration = duration or 0.50
offsetX = offsetX or 18
local dl = imgui.GetWindowDrawList()
dl.Flags = imgui.DrawListFlags.AntiAliasedFill
local p = imgui.GetCursorScreenPos()
if not CommandsSelect[text] then
CommandsSelect[text] = {time = nil, time2 = nil}
end
local result = imgui.InvisibleButton(text, size)
if result and not bool then
CommandsSelect[text].time = os.clock()
end
 
if bool then
if CommandsSelect[text].time and (os.clock() - CommandsSelect[text].time) < duration then
local w = (os.clock() - CommandsSelect[text].time) / duration * 100
dl:AddRectFilled(imgui.ImVec2(p.x + 5 + (w / 20), p.y + (w / 20)), imgui.ImVec2(p.x + size.x - (w / 20), p.y + size.y - (w / 20)), 0x70676868, 10)
if (os.clock() - CommandsSelect[text].time) >= (duration - 0.1) then
CommandsSelect[text].time2 = os.clock()
end
elseif CommandsSelect[text].time2 and (os.clock() - CommandsSelect[text].time2) < duration then
local w = (os.clock() - CommandsSelect[text].time2) / duration * 100
dl:AddRectFilled(imgui.ImVec2(p.x + 10 - (w / 20), p.y + 5 - (w / 20)), imgui.ImVec2(p.x + size.x - 5 + (w / 20), p.y + size.y - 5 + (w / 20)), 0x70676868, 10)
else
dl:AddRectFilled(imgui.ImVec2(p.x + 5, p.y), imgui.ImVec2(p.x + size.x, p.y + size.y), 0x5c545555, 10)
end
else
dl:AddRectFilled(imgui.ImVec2(p.x + 5, p.y), imgui.ImVec2(p.x + size.x, p.y + size.y), 0x6e646464, 10)
end
 
imgui.SameLine(offsetX); imgui.SetCursorPosY(imgui.GetCursorPos().y + 10)
imgui.Text(text:gsub('##.+', ''))
 return result
end
Когда я делаю так к примеру:

Lua:
imgui.CommandsSelect(u8'рапапрапр')
imgui.SameLine()
imgui.Button('123')
то кнопка уходит вниз

Пример:
220869

Что не так?
 

tsunamiqq

Участник
433
17
Ну я впрн понимал что из-за этого, но как решить? мне прост не хочется что-бы текст прислонялся к границам сверху, а что-бы был с отступом (Я почему-то не могу процитировать твой текст)
 

MrDorlik

Известный
950
383
Ну я впрн понимал что из-за этого, но как решить? мне прост не хочется что-бы текст прислонялся к границам сверху, а что-бы был с отступом (Я почему-то не могу процитировать твой текст)
так в прошлом сообщении ты писал что кнопка уходит вниз, уходит вниз из-за строки которую выше скинули (ее типа удалить надо чтоб не было такого пон да?) щас ты про прислонение говоришь какое-то, отступ такой же функцией можно сделать только смещение по x а не по y (заменить типа y на x пон да?)
 

tsunamiqq

Участник
433
17
так в прошлом сообщении ты писал что кнопка уходит вниз, уходит вниз из-за строки которую выше скинули (ее типа удалить надо чтоб не было такого пон да?) щас ты про прислонение говоришь какое-то, отступ такой же функцией можно сделать только смещение по x а не по y (заменить типа y на x пон да?)
Ну так эта функция мне нужна для отступа текста, а не для кнопки, x - по горизонтали, y - по вертикали, если заменю, то будет отступ по горизонтали, а мне нужно по вертикали), мне нужно убрать только отступ для кнопки, только не знаю каким образом это сделать
 

MrDorlik

Известный
950
383
Ну так эта функция мне нужна для отступа текста, а не для кнопки, x - по горизонтали, y - по вертикали, если заменю, то будет отступ по горизонтали, а мне нужно по вертикали), мне нужно убрать только отступ для кнопки, только не знаю каким образом это сделать
теперь текст еще какой-то... все что нужно было я сказал по-моему, не нужен отступ - удаляй строку с отступом, нужен - добавляй по x или y. ну либо в пеинте нарисуй что ты сделать хочешь потому что я не понял ничего
Lua:
imgui.CommandsSelect(u8'рапапрапр')
imgui.SameLine(); imgui.SetCursorPosY(imgui.GetCursorPos().y - 10)
imgui.Button('123')
вот так тебе надо не?
 
Последнее редактирование: