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

the same

Активный
176
23
Как закрыть диалог ( от сервера) с помощью луа , чтобы не было бага "Закройте диалог" при вводе команд.

Lua:
function SE.onShowDialog(dialogId, style, title, button1, button2, text)
    if test == 1 then --admins
        sampSendDialogResponse(dialogId, 1, 8, none)
        sampSendDialogResponse(dialogId, button1)
        return false
      end
 
Последнее редактирование:

bedolaga123123

Новичок
22
5
Ребят, сделайте из вот этого аирбрейка конфетку, тоесть что бы он летал не только WS, а WASD. Мне уже пытались что-то объяснить как поменять, но я чота ничо не понял =)
Всем добра и позитива!
 

Вложения

  • AirBrake.lua
    4.5 KB · Просмотры: 5

Dmitriy Makarov

25.05.2021
Проверенный
2,500
1,131
im trying to save value "i" to a file, so it would load the i value on game start i want the ini to update the value after /testmsg has ran i tried using inicfg, watched tutorial no help

goofy ass code:
local inicfg = require 'inicfg'
local i = 0


function main()
    while not isSampAvailable() do wait(0) end
    sampRegisterChatCommand('testmsg', function(cmd)
        sampAddChatMessage('test' ..i.. "message", -1)
        i = i + 1
    end)
    while true do
        wait(0)
    end
end
Lua:
local inicfg = require 'inicfg'

local mainIni = inicfg.load({
    config = {
        i = 0
    }
}, "settings.ini")

-- Create ini file
if not doesFileExist('moonloader/config/setting.ini') then
    inicfg.save(mainIni, 'setting.ini')
end

function main()
    while not isSampAvailable() do wait(0) end
    sampRegisterChatCommand('testmsg', function()
        sampAddChatMessage('test' ..mainIni.config.i.. "message", -1)
        mainIni.config.i = mainIni.config.i + 1
        inicfg.save(mainIni, 'settings.ini')
    end)
    wait(-1)
end
 
  • Влюблен
Реакции: ZonePO

Hund dev.

Участник
47
2
Как сделать надпись по центру машины? Сейчас ее местоположение равняется координатам положения машины на экране
 

Вложения

  • sa-mp-003.png
    sa-mp-003.png
    488.9 KB · Просмотры: 17

chapo

чопа сребдс // @moujeek
Модератор
8,862
11,550
Окей, как получить ширину и высоту текста?
Lua:
float height = renderGetFontDrawHeight(DxFont font)
float length = renderGetFontDrawTextLength(DxFont font, zstring text [, bool ignoreColorTags=false])

--например
local sizeX = renderGetFontDrawTextLength(твоя переменная с шрифтом, твой текст, false)
local sizeY = renderGetFontDrawHeight(твоя переменная с шрифтом)
 
  • Нравится
Реакции: qdIbp

Hund dev.

Участник
47
2
Lua:
float height = renderGetFontDrawHeight(DxFont font)
float length = renderGetFontDrawTextLength(DxFont font, zstring text [, bool ignoreColorTags=false])

--например
local sizeX = renderGetFontDrawTextLength(твоя переменная с шрифтом, твой текст, false)
local sizeY = renderGetFontDrawHeight(твоя переменная с шрифтом)
Спасибо

Lua:
float height = renderGetFontDrawHeight(DxFont font)
float length = renderGetFontDrawTextLength(DxFont font, zstring text [, bool ignoreColorTags=false])

--например
local sizeX = renderGetFontDrawTextLength(твоя переменная с шрифтом, твой текст, false)
local sizeY = renderGetFontDrawHeight(твоя переменная с шрифтом)
Произошел один ньюанс:
Lua:
local carLabel = string.format("%s[%d]\nHealth: %d\nX: %d | Y: %d | Z: %d\nDistance: %d", modelLabel, modelId, carHealth, carX, carY, carZ, distance)
Вроде бы все хорошо, но функция
Lua:
local carLabelWidth = renderGetFontDrawTextLength(smallFont, carLabel, false)
Получает длину строки с учетом (\n), а не делает каждую строку по центру.
Как можно реализовать центрирование, без прибегания к костылям по типу
Lua:
local carLabelWidth1 = renderGetFontDrawTextLength(smallFont, carLabel1, false)
local carLabelWidth2 = renderGetFontDrawTextLength(smallFont, carLabel2, false)
local carLabelWidth3 = renderGetFontDrawTextLength(smallFont, carLabel3, false)

if carLabelWidth1 > carLabelWidth2 then
...
end
?
 
Последнее редактирование:

l-m

Новичок
28
1
Буду очень благодарен в помощи. Прошу поставить ограничение на использование команды. Например при использовании трижды данной функции, на четвёртый раз устанавливается лимит сроком на 5 минут, по истечению этих 5 минут опять можно использовать трижды и снова ставится лимит на время(в чат будет сообщать что доступно будет по истечению время, ну с этим я думаю и сам справлюсь))))).
Так же не могу поставить антифлуд,(чтобы скрипт если начал работать то не видел последующих команд пока не закончит начатую).
1673646233203.png

Код:
function sampev.onServerMessage(color--[[Цвет]], text--[[Текст]]) -- Этот хук ловит сообщения в чате
    lua_thread.create(function() -- создаем поток -- позволяет использовать wait
        if text:find('[R].*: /driver') then -- если найден текст "test" то
            wait(100) -- отвечает за ожидание в размере секунды БЫЛО 1000 сек
            sampSendChat('/r Вызываю эвакуатор через 10 секунд')
            wait(5000)
            sampSendChat('/r (( /drive 5 sek ))')
            wait(4000)
            sampSendChat('/r Вызываю эвакуатор через 1 секунду, кто не успел тот опоздал')
            wait(1000)
            sampSendChat('/drive') -- если в чате засветится сообщение test, то хук поймает данное сообщение, дальше скрипт подождет 1 секунду и выведет "Не тест"
            wait(2000)
            sampCloseCurrentDialogWithButton(1) --закрывает окно с нажатием кнопки
        elseif text:find('[R].*: /cancel') then
            sampSendChat("/r (( drive disabled ))")
            wait(500)
            thisScript():reload()
        end
    end)-- закрываем поток
end

Прошу объяснить максимально подробно начинающему недоскриптеру)
Пробовал ставить через "while i <=3" и получался флуд трижды и функция останавливалась
 
Последнее редактирование:

Armando Guerra

Новичок
16
1
Код:
price = '100.000'
price = string.gsub(price,  '.',  '')

Удаляется вся строка, хотя хотелось бы удалить только точку, хелпаните пожалуйста
 

l-m

Новичок
28
1
Как показать в коде что функция начала работу после ввода команды активации?