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

Petr_Sergeevich

Известный
Проверенный
707
296
Парни,как написать скрипт,который бы определял расстояние до метки? Не метку которая на карте, а типо такой:(но которая отображается на карте красным квадратиком)
33689604.jpg
Lua:
local sampev = require 'lib.samp.events'
function sampev.onSetCheckpoint(position, radius)
    local x, y, z = getCharCoordinates(PLAYER_PED)
    local distance = getDistanceBetweenCoords3d(x, y, z, position.x, position.y, position.z)
    sampAddChatMessage("Расстояние до чекпоинта: " .. distance, -1)
end

Срабатывает один раз, когда чекпоинт появляется на карте. Можешь потом записывать куда-нибудь координаты и что-то с этим всем делать
 

Akionka

akionka.lua
Проверенный
742
500
Как добиться такого же эффекта на lua? Залочена камера + показана мышь. В Pawn это SelectTextDraw()
 

Вложения

  • sa-mp-000.png
    sa-mp-000.png
    171.6 KB · Просмотры: 179

Tenkara

Потрачен
380
171
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Какой номерок у ПКМ? и как сделать что когда жму ПКМ и insert и таргета нет - пишет в чат

Lua:
function targer()
    while true do wait(0)
        if isKeyJustPressed(45) then
 

Petr_Sergeevich

Известный
Проверенный
707
296
Последнее редактирование:

deddosouru

Смотрю аниме, служу Сатане
Друг
2,036
1,320

Belo4ka_belka

Известный
191
7
Как применить пушфонт к виджету? В аргументах он принимает какую-то структуру, ибо это явно не строковое название желаемого шрифта. Конкретно интересует times new roman 10-го размера.
 

trefa

Известный
Всефорумный модератор
2,097
1,233
Существуют ли переменные для измены виртуального мира ( нашел только для изменение интерьера)
и для временной заморозки персонажа
1 - нет
2- да

Как применить пушфонт к виджету? В аргументах он принимает какую-то структуру, ибо это явно не строковое название желаемого шрифта. Конкретно интересует times new roman 10-го размера.
Что за виджет, imgui?
 

Belo4ka_belka

Известный
191
7
1 - нет
2- да


Что за виджет, imgui?
Да. Обычный text. Сейчас применяю такую штуку:
Код:
-- в секции автовыполнения
imgui.GetIO().Fonts:Clear()
    glyph_ranges_cyrillic = imgui.GetIO().Fonts:GetGlyphRangesCyrillic()
    imgui.GetIO().Fonts:AddFontFromFileTTF(getFolderPath(0x14) .. '\\Calibri.ttf', 25.0, nil, glyph_ranges_cyrillic)
    imgui.RebuildFonts()
Но даже я понимаю что это зашквар. + почему-то не хочет times new roman применять (ошибку Visual studio выдает когда скрипт до этого кода доходит) (каждую букву с названием шрифта в fonts сравнивал - все верно. Не применяются только шрифты содержащие несколько слов в названии (где есть пробелы)). Хотелось бы иметь возможность применять шрифт и размер для каждого элемента по отдельности, а не всем скопом как в примере выше. Ну или хотя-бы размер шрифта...
 

trefa

Известный
Всефорумный модератор
2,097
1,233
Да. Обычный text. Сейчас применяю такую штуку:
Код:
-- в секции автовыполнения
imgui.GetIO().Fonts:Clear()
    glyph_ranges_cyrillic = imgui.GetIO().Fonts:GetGlyphRangesCyrillic()
    imgui.GetIO().Fonts:AddFontFromFileTTF(getFolderPath(0x14) .. '\\Calibri.ttf', 25.0, nil, glyph_ranges_cyrillic)
    imgui.RebuildFonts()
Но даже я понимаю что это зашквар. + почему-то не хочет times new roman применять (ошибку Visual studio выдает когда скрипт до этого кода доходит) (каждую букву с названием шрифта в fonts сравнивал - все верно. Не применяются только шрифты содержащие несколько слов в названии (где есть пробелы)). Хотелось бы иметь возможность применять шрифт и размер для каждого элемента по отдельности, а не всем скопом как в примере выше. Ну или хотя-бы размер шрифта...
times.ttf пробуй
 
  • Нравится
Реакции: Belo4ka_belka

Petr_Sergeevich

Известный
Проверенный
707
296
Я конечно попробую, но сможешь мне объяснить за пушфонт что-то? Хотелось бы все таки иметь гибкость для каждого элемента.
Создаёшь уникальный шрифт (название!):
Lua:
local exFont = nil
function imgui.BeforeDrawFrame()
    if exFont == nil then
        imgui.GetIO().Fonts:Clear()
        exFont = imgui.GetIO().Fonts:AddFontFromFileTTF(getFolderPath(0x14)..'\\arial.ttf', 16.0, nil, imgui.GetIO().Fonts:GetGlyphRangesCyrillic())
        -- Чтобы остался дефолтный шрифт для прочих элементов:
        imgui.GetIO().Fonts:AddFontFromFileTTF(getFolderPath(0x14)..'\\trebucbd.ttf', 15.5, nil, imgui.GetIO().Fonts:GetGlyphRangesCyrillic())
        imgui.RebuildFonts()
    end
end

Использование:
Lua:
imgui.PushFont(exFont)
    imgui.Text("example")
imgui.PopFont()
 

Belo4ka_belka

Известный
191
7
АААА. То есть я уже почти все верно сделал?? Емае как я не догадался сам... Спасибо!