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

kraft1k

Вынь х*й из головы и все получится © hnnssy
Друг
1,480
1,168
это или я тупой или что?
текст выводит анимку не сбивает
Lua:
require 'lib.moonloader'
local sampev = require 'lib.samp.events'

enabled = true
cheatActivate = 'QQ'

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    repeat wait(0) until isSampAvailable()

    while true do
        wait(10)
        if testCheat(cheatActivate) then
            enabled = not enabled
            printStringNow('~g~Successful', 2000)
        end
    end
end

function sampev.onApplyPlayerAnimation(l, b, d, f, j, a, e, o)
     if enabled then
         if anim then
         return false
         end
     end
end

function sampev.onTogglePlayerControllable(controllable)
     if enabled then    
         if not controllable then
         return false
         end
     end
end
Lua:
require 'lib.moonloader'
local sampev = require 'lib.samp.events'

enabled = false

function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    while not isSampAvailable() do wait(0) end

    while true do
        wait(10)
        if testCheat('QQ') then
            enabled = not enabled
        end
                if enabled == true then
                    local posX, posY, posZ = getCharCoordinates(playerPed)
                    setCharCoordinates(playerPed, posX, posY, posZ-1.0)
                    freezeCharPosition(playerPed, false)
                    restoreCameraJumpcut()
                    printStringNow('~g~Successful', 2000)
                    repeat
                     wait(0)
                    until testCheat('QQ')
                    enabled = not enabled
                    printStringNow('~r~OFF', 2000)
                end
    end
end

function sampev.onApplyPlayerAnimation(playerId, animLib, animName, loop, lockX, lockY, freeze, time)
     if enabled then return false end
end

function sampev.onTogglePlayerControllable(controllable)
     if enabled then return false end
end

Странно если написать в cleo 0acd: show_text_high_priority " —" time 1000 выводится буква Б. А если ли через lua s = " —"
printString(string.format("%s", s), 900) то выводится "бю"
Кто почему так?
Возможно связано из-за кодировок или компиляции программ(но это не точно)
 
  • Нравится
Реакции: asocial demon

egor230

Участник
47
16
@kraft1k Спасибо за ваш ответ. Скажите пожалуйста как проверить запущена миссия? Включить флаг миссии?
 

Gishit

Известный
446
120
[RAKBOT] - [lua]
Как сделать чтобы при появлении в чате слова - текста вводило к примеру
*Вам выдали* после этого текста что бы включалось runCommand('!tp <X> <Y> <Z>');
 

checkdasound

Известный
Проверенный
963
410
Как убрать все элементы из таблицу, table.remove как я понял убирает только по одному.
 

Лисёнок

Новичок
6
7
Подскажите пожалуйста, как получить содержимое имгуи инптупа, которое выделенное?
с помощью указателя на состояние, который может получить только колбек этого инпута

Как убрать все элементы из таблицу, table.remove как я понял убирает только по одному.
lmao
Lua:
t = {}
 
  • Нравится
Реакции: checkdasound

FunTan

Известный
31
0
При попытке заполнения массива командой "/mass 1 2 3 4 5" результат заносит только в первый элемент массива (m[1] = 1 2 3 4 5), а нужно, что бы каждое значение заносилось в отдельный элемент массива:
m[1] = 1
m[2] = 2
m[3] = 3
m[4] = 4
m[5] = 5
Lua:
require 'lib.moonloader'
require 'lib.sampfuncs'

function main()
    if not isSampLoaded() or not isCleoLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand("mass", skill)
    wait(-1)
end

function skill(param)
    if #param == 0 then
        print("Syntax: /massive [values with spaces]")
    else
    m = {}
        for value in param:gmatch('(.+) ') do
            table.insert(m, value)
        end
           print m
    end
end
 

Лисёнок

Новичок
6
7
При попытке заполнения массива командой "/mass 1 2 3 4 5" результат заносит только в первый элемент массива (m[1] = 1 2 3 4 5), а нужно, что бы каждое значение заносилось в отдельный элемент массива:
m[1] = 1
m[2] = 2
m[3] = 3
m[4] = 4
m[5] = 5
Lua:
require 'lib.moonloader'
require 'lib.sampfuncs'

function main()
    if not isSampLoaded() or not isCleoLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand("mass", skill)
    wait(-1)
end

function skill(param)
    if #param == 0 then
        print("Syntax: /massive [values with spaces]")
    else
    m = {}
        for value in param:gmatch('(.+) ') do
            table.insert(m, value)
        end
           print m
    end
end
Lua:
..in param:gmatch("%d+") do...
 
  • Нравится
Реакции: FunTan

Harryss

Участник
233
26
Не могу разобраться с регуляркой, которой надо вывести никнейм из текста диалога. Пытаюсь хукать на английские символы, но он еще хватает чушь по типу колора текста и прочего.
Lua:
function ev.onShowDialog(id, style, title, btn, btn, text)
    if text:find("обвиняется в следующих статьях:") then
        for w in string.gmatch(text, '%a+') do
            print(w)
        end
    end
end
 

asocial demon

Потрачен
175
14
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
чем отличается
Lua:
setVirtualKeyDown(int vkey, bool down)
от
Lua:
setCharKeyDown(int ckey, bool down)
 

LZTD

Активный
129
25
Почему не рандомит?
Пишет всегда последнее значение в таблице
Lua:
    local tabletest = { 'a', 'f', 'c', 's'}
    sampSendChat(tabletest[math.random(1, #tabletest)])
 

asocial demon

Потрачен
175
14
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
как мне проверить текст кнопки 1?
 

asocial demon

Потрачен
175
14
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
как ввести в поле диалога текст? хук
Lua:
function sampev.onShowDialog(dialogId, style, title, button1, button2, text)
 

Frapsy

Известный
Проверенный
393
227
Не могу разобраться с регуляркой, которой надо вывести никнейм из текста диалога. Пытаюсь хукать на английские символы, но он еще хватает чушь по типу колора текста и прочего.
Lua:
function ev.onShowDialog(id, style, title, btn, btn, text)
    if text:find("обвиняется в следующих статьях:") then
        for w in string.gmatch(text, '%a+') do
            print(w)
        end
    end
end
полную строку давай