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

.Makarov.

Известный
188
36
Помогите пожалуйста с регуляркой. Голову сломал уже... Либо лишнее захватывает, либо и вовсе ничего. В чем суть: Надо получить только название предмета, которое находится между двумя цветовыми тегами. Название может быть как на англ, так и на русском, с цифрами и без. Заранее спасибо =)
Код:
{FFFFFF}Предмет: {FDCF28}Металл{FFFFFF}
Можно приобрести на {FDCF28}Центральном{FFFFFF} рынке,
добыть на шахте ({FDCF28}/GPS - Разное - Шахта.{FFFFFF})
Используется для изготовления (крафта) {FDCF28}редких товаров{FFFFFF} в
подвале дома или улучшения {FDCF28}гаража{FFFFFF}.

{ffffff}Можно хранить в одной ячейке: {cccccc}200 ед. предмета.
{67BE55}
В наличии: 200 шт.
Стоимость: $36.000 за 1 шт.

{FFFFFF}Введите какое количество вы хотите {555ABE}КУПИТЬ:

{ff0000}Примечание:
{2E9AFE}Ваших денег хватит на 6622 ед. товара.
 

Rice.

Известный
Модератор
1,756
1,624
Помогите пожалуйста с регуляркой. Голову сломал уже... Либо лишнее захватывает, либо и вовсе ничего. В чем суть: Надо получить только название предмета, которое находится между двумя цветовыми тегами. Название может быть как на англ, так и на русском, с цифрами и без. Заранее спасибо =)
Код:
{FFFFFF}Предмет: {FDCF28}Металл{FFFFFF}
Можно приобрести на {FDCF28}Центральном{FFFFFF} рынке,
добыть на шахте ({FDCF28}/GPS - Разное - Шахта.{FFFFFF})
Используется для изготовления (крафта) {FDCF28}редких товаров{FFFFFF} в
подвале дома или улучшения {FDCF28}гаража{FFFFFF}.

{ffffff}Можно хранить в одной ячейке: {cccccc}200 ед. предмета.
{67BE55}
В наличии: 200 шт.
Стоимость: $36.000 за 1 шт.

{FFFFFF}Введите какое количество вы хотите {555ABE}КУПИТЬ:

{ff0000}Примечание:
{2E9AFE}Ваших денег хватит на 6622 ед. товара.
Lua:
local samp = require('samp.events')
function samp.onShowDialog(dialogId, style, title, button1, button2, text)
    for line in text:gmatch("[^\n]+") do
        if line:find('{FFFFFF}Предмет:.+') then
            local item = line:match('{FFFFFF}Предмет: {FDCF28}(.+){FFFFFF}')
            print(item)
        end
    end
end
 
  • Нравится
Реакции: .Makarov.

.Makarov.

Известный
188
36
Lua:
local samp = require('samp.events')
function samp.onShowDialog(dialogId, style, title, button1, button2, text)
    if text:find('{......}Предмет: {......}.+{......}') then
        local item = text:match('{......}Предмет: {......}(.+){......}')
        print(item)
    end
end
Код:
Twin Turbo{FFFFFF}
Можно получить с {FDCF28}Silver{FFFFFF} и {FDCF28}Gold{FFFFFF} рулеток
или на центральном рынке.
Используется для установки н

Код:
Охлаждающая жидкость для видеокарты{ffffff}
Используется для восстановления
системы охлаждения видеокарты.
Если состояние охлаждения видеокарты
 

Rice.

Известный
Модератор
1,756
1,624
Код:
Twin Turbo{FFFFFF}
Можно получить с {FDCF28}Silver{FFFFFF} и {FDCF28}Gold{FFFFFF} рулеток
или на центральном рынке.
Используется для установки н

Код:
Охлаждающая жидкость для видеокарты{ffffff}
Используется для восстановления
системы охлаждения видеокарты.
Если состояние охлаждения видеокарты
Ну так добавь отдельную проверку local item = text:match('(.+){......}')
Ты спросил одно, а предъявляешь мне за другое
 

.Makarov.

Известный
188
36
Ну так добавь отдельную проверку local item = text:match('(.+){......}')
Ты спросил одно, а предъявляешь мне за другое
Где я предъявляю не за то что спросил? Сделал как ты написал и прислал то что вышло:
Lua:
if dialogId == 3082 then
    if text:find('{......}Предмет: {......}.+{......}') then
        local item = text:match('{......}Предмет: {......}(.+){......}')
        sampAddChatMessage(item,-1)
    end
end
 

Rice.

Известный
Модератор
1,756
1,624
Где я предъявляю не за то что спросил? Сделал как ты написал и прислал то что вышло:
Lua:
if dialogId == 3082 then
    if text:find('{......}Предмет: {......}.+{......}') then
        local item = text:match('{......}Предмет: {......}(.+){......}')
        sampAddChatMessage(item,-1)
    end
end
Извини, неправильно понял суть твоего текста выше.
Без цикла здесь не получится, потому-что чтобы избавиться от текста после названия нужно какой-то опознавательный символ. На аризоне описание предметов разное, поэтому сделай через цикл и всё.

Lua:
local samp = require('samp.events')
function samp.onShowDialog(dialogId, style, title, button1, button2, text)
    for line in text:gmatch("[^\n]+") do
        if line:find('{......}.+:%s*{......}.+{......}') then
            local item = line:match('{......}.+:%s*{......}(.+){......}')
            print(item)
        end
    end
end
 
  • Нравится
Реакции: .Makarov.

ollydbg

Известный
163
115
i need this in lua

CLEO:
:WeaponsUpdate
0AC8: 4@ = allocate_memory_size 6
0C0D: struct 4@ offset 0 size 2 = 0@ // targetPlayerId
0A96: 1@ = actor $PLAYER_ACTOR struct
0a8e: 2@ = 1@ + 0x718
0A8D: 2@ = read_memory 2@ size 1 virtual_protect 0
0C0D: struct 4@ offset 2 size 1 = 2@ // slot
0470: 3@ = actor $PLAYER_ACTOR current_weapon
0C0D: struct 4@ offset 3 size 1 = 3@ // weapon
041A: 7@ = actor $PLAYER_ACTOR weapon 3@ ammo
0C0D: struct 4@ offset 4 size 2 = 7@ // ammo
0B3D: raknet 5@ = new_bit_stream
0B40: raknet bit_stream 5@ write PACKET_WEAPONS_UPDATE type BS_TYPE_BYTE size 1
0B40: raknet bit_stream 5@ write 4@ type BS_TYPE_ARRAY size 6
0B8B: raknet send bit_stream 5@
0B3E: raknet delete_bit_stream 5@
0AC9: free_allocated_memory 4@
0AB2: ret 0
 

Dmitriy Makarov

25.05.2021
Проверенный
2,500
1,131
Lua:
-- // Используется для отправки в чат //
function getPlayerPost()
    for i = 1, #gang_zones do
        if isCharInArea2d(PLAYER_PED, gang_zones[i][3], gang_zones[i][6], gang_zones[i][5], gang_zones[i][4], false) then
            return gang_zones[i][1]
        else
            return "None"
        end
    end
end
-- // =============================== //


-- // Используется для рендера на экране //
for i = 1, #gang_zones do
    if isCharInArea2d(PLAYER_PED, gang_zones[i][3], gang_zones[i][6], gang_zones[i][5], gang_zones[i][4], false) then
        renderFontDrawText(font, "Пост: "..gang_zones[i][1], 40, 250, -1)
    end
end
-- // ================================== //
Не знаете, почему функция getPlayerPost(), в отличии от куска кода ниже, почти всегда возвращает "None"? Код же вроде одинаковый.
Screenshot_2.png

Сверху чат, снизу - рендер. Рендер всегда правильно показывает. Функция чаще всего возвращает "None".
 

Curtis

Участник
282
10
Как в диалоговом окне заменить строку на свою ? Помогите пожалуйста
 

Doomsday

Новичок
14
0
Lua:
function getCoordOnMap()
    local lib, requests = pcall(require, 'requests')
    if lib then
        local response = requests.get(
            'Сайт',
            {
                params = {['coord'] = 'true'},
                headers = {
                    ['user-agent'] = 'Mozilla/5.0'
                },
                timeout = 30
            }
        )
.

Данная конструкция берет корды с сайта. Как сделать так, чтобы параллельно еще брал корды с блокнота, в котором собственноручно вбиты свои корды?!