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

PavelUrus

Новичок
9
0
Не могу понять, почему он не хочет перебирать массив, вот код.
Код:
require "lib.moonLoader"
require "lib.vkeys"
color_message = 0xFF00FF

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    numbers = {1, 2, 3, 4, 5}
    sampRegisterChatCommand("dictionary", function_numbers)
    while true do
        if isKeyDown(VK_MENU) and isKeyJustPressed(VK_1) then
            sampAddChatMessage("On {FFFFFF}Alt + 1", color_message)
        end
        wait(0)
    end
end

function function_numbers(numbers)
    for value in ipairs(numbers) do
        sampAddChatMessage(value, color_message)
    end
end
 

Fabregoo

Известный
656
128
Как при появленние слова в чате, заменять его на другое, к примеру появилась строка в чате.
Администратор.
Можно ли ее изменить другое слово, К примеру Иванов
 

Carlos777

Потрачен
227
219
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Как при появленние слова в чате, заменять его на другое, к примеру появилась строка в чате.
Администратор.
Можно ли ее изменить другое слово, К примеру Иванов
string.gmatch
string.match хз как-то так
 
  • Нравится
Реакции: Fabregoo

Angr

Известный
291
99
Как при появленние слова в чате, заменять его на другое, к примеру появилась строка в чате.
Администратор.
Можно ли ее изменить другое слово, К примеру Иванов
Lua:
local text = "Тут могла быть ваша реклама"

local newText = text:gsub("реклама","мама")

print(newText)
 
Последнее редактирование:

Vespan

Чешский луашер
Проверенный
2,120
1,721
Как сделать,что когда я написал в .ini файл F5(клавиша) то на эту клавишу (F5) активировалось сообщение в чат
!(НЕ TESTCHEAT для слепых говорю )!
 

rum228

Новичок
2
0
Как можно перехватить координаты mapicons? Т.е логировать позицию и их ид? (желательно код, я не шарю, спасибо :*)
 

kingleonides

Участник
43
28
Не могу понять, почему он не хочет перебирать массив, вот код.
Код:
require "lib.moonLoader"
require "lib.vkeys"
color_message = 0xFF00FF

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    numbers = {1, 2, 3, 4, 5}
    sampRegisterChatCommand("dictionary", function_numbers)
    while true do
        if isKeyDown(VK_MENU) and isKeyJustPressed(VK_1) then
            sampAddChatMessage("On {FFFFFF}Alt + 1", color_message)
        end
        wait(0)
    end
end

function function_numbers(numbers)
    for value in ipairs(numbers) do
        sampAddChatMessage(value, color_message)
    end
end
Твой скрипт работает по другому принципу
sampRegisterChatCommand("dictionary", function_numbers)
в аргумент функции function_numbers у тебя упадет то, что ты напишешь в чате.
Ты пишешь допустим, /dictionary 1 и у тебя должно вывестись 1, но никак не перебор таблицы, потому что ты строку в чате передаешь, а функции обрабатываешь таблицу

Lua:
require "lib.moonLoader"
require "lib.vkeys"
color_message = 0xFF00FF
local numbers = {1, 2, 3, 4, 5}

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    
    sampRegisterChatCommand("dictionary", function_numbers)

    while true do
        if isKeyDown(VK_MENU) and isKeyJustPressed(VK_1) then
            sampAddChatMessage("On {FFFFFF}Alt + 1", color_message)
        end
        wait(0)
    end
end


function function_numbers()
    for value in ipairs(numbers) do
        sampAddChatMessage(value, color_message)
    end
end

-- Чтобы реализовать твою задумку, это подачу /dictionary 1,2,3,4,5 а на выходе иметь 5 отдельных сообщений
-- то нужно сплитить сообщение

require "lib.moonLoader"
require "lib.vkeys"
color_message = 0xFF00FF

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    
    sampRegisterChatCommand("dictionary", function_numbers)

    while true do
        if isKeyDown(VK_MENU) and isKeyJustPressed(VK_1) then
            sampAddChatMessage("On {FFFFFF}Alt + 1", color_message)
        end
        wait(0)
    end
end

function string.split(self, delimiter)
    result = {};
    for match in (self..delimiter):gmatch("(.-)"..delimiter) do
        table.insert(result, match);
    end
    return result;
end
-- /dictionary 1,2,3,4,5
--[[ output
    1
    2
    3
    4
    5
]]

function function_numbers(numbers)
    for k, v in pairs(numbers:split(",")) do
        sampAddChatMessage(v, color_message)
    end
end
 

DolgorukovGTA

Известный
Проверенный
652
345
Как сделать,что когда я написал в .ini файл F5(клавиша) то на эту клавишу (F5) активировалось сообщение в чат
!(НЕ TESTCHEAT для слепых говорю )!
Самая простая реализация: в ini-файл заносить номер клавиши, у F5 - это 116 (в 10-ричном формате) и 0x74 (16-ричном). После чего делать проверку на клавишу в скрипте:
Lua:
if isKeyJustPressed(путь к твоей переменной в ini) then
    -- code
end
 

Vespan

Чешский луашер
Проверенный
2,120
1,721
Самая простая реализация: в ini-файл заносить номер клавиши, у F5 - это 116 (в 10-ричном формате) и 0x74 (16-ричном). После чего делать проверку на клавишу в скрипте:
Lua:
if isKeyJustPressed(путь к твоей переменной в ini) then
    -- code
end
А как сделать если я хочу ид клавишы через key.VK_клавиша ?
 

kingleonides

Участник
43
28
Как сделать,что когда я написал в .ini файл F5(клавиша) то на эту клавишу (F5) активировалось сообщение в чат
!(НЕ TESTCHEAT для слепых говорю )!
YouScript.lua.ini файл

[hotkeySimple]
key=0x74


YouScript.lua файл
Lua:
local iniFile = inicfg.load()

function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    while not isSampAvailable() do wait(200) end
    
    while true do
        wait(0)
        if wasKeyPressed(iniFile.key) then
            sampAddChatMessage("визуальное сообщение")
        end
    end
end
 

PavelUrus

Новичок
9
0
Твой скрипт работает по другому принципу
sampRegisterChatCommand("dictionary", function_numbers)
в аргумент функции function_numbers у тебя упадет то, что ты напишешь в чате.
Ты пишешь допустим, /dictionary 1 и у тебя должно вывестись 1, но никак не перебор таблицы, потому что ты строку в чате передаешь, а функции обрабатываешь таблицу

Lua:
require "lib.moonLoader"
require "lib.vkeys"
color_message = 0xFF00FF
local numbers = {1, 2, 3, 4, 5}

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
  
    sampRegisterChatCommand("dictionary", function_numbers)

    while true do
        if isKeyDown(VK_MENU) and isKeyJustPressed(VK_1) then
            sampAddChatMessage("On {FFFFFF}Alt + 1", color_message)
        end
        wait(0)
    end
end


function function_numbers()
    for value in ipairs(numbers) do
        sampAddChatMessage(value, color_message)
    end
end

-- Чтобы реализовать твою задумку, это подачу /dictionary 1,2,3,4,5 а на выходе иметь 5 отдельных сообщений
-- то нужно сплитить сообщение

require "lib.moonLoader"
require "lib.vkeys"
color_message = 0xFF00FF

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
  
    sampRegisterChatCommand("dictionary", function_numbers)

    while true do
        if isKeyDown(VK_MENU) and isKeyJustPressed(VK_1) then
            sampAddChatMessage("On {FFFFFF}Alt + 1", color_message)
        end
        wait(0)
    end
end

function string.split(self, delimiter)
    result = {};
    for match in (self..delimiter):gmatch("(.-)"..delimiter) do
        table.insert(result, match);
    end
    return result;
end
-- /dictionary 1,2,3,4,5
--[[ output
    1
    2
    3
    4
    5
]]

function function_numbers(numbers)
    for k, v in pairs(numbers:split(",")) do
        sampAddChatMessage(v, color_message)
    end
end
Объясни пожалуйста пошагово эту функцию
Код:
function string.split(self, delimiter)
    result = {};
    for match in (self..delimiter):gmatch("(.-)"..delimiter) do
        table.insert(result, match);
    end
    return result;
Потому что я подругому решил сделать, и вот так получилось, все выводит.
Код:
require "lib.moonLoader"
require "lib.vkeys"
color_message = 0xFF00FF
numbers = {2}

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand("dictionary", function_numbers)
    while true do
        if isKeyDown(VK_MENU) and isKeyJustPressed(VK_1) then
            sampAddChatMessage("On {FFFFFF}Alt + 1", color_message)
        end
        wait(0)
    end
end

function function_numbers()
    for key, value in ipairs(numbers) do
        sampAddChatMessage("ключ : " .. key .. " значение: " .. value,
        color_message)
    end
end
 

Fabregoo

Известный
656
128
Как сделать,что когда я написал в .ini файл F5(клавиша) то на эту клавишу (F5) активировалось сообщение в чат
!(НЕ TESTCHEAT для слепых говорю )!
Зачем же сразу переходить на личность?
ТЫ не можешь вместо if testcheat вставить if isKeyJustPressed?
Думаю лучше снятся с админки на монсере.