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

W1ll04eison

Известный
330
19
Подскажите почему при открытии имгуи окна курсор пропадает (он мерцает, если двигать мышкой)

Хотя курсор нигде не имеет значение false
 
Последнее редактирование:

moreveal

Известный
988
723
Подозреваю, что это из-за разрыва соединения и невозможности отправки того самого запроса.

Я хоть в этом деле не очень шарю, но, считаю будет правильным чекать подключение или перед отправкой запроса или каждые 1-2 секунды, например.
mysql_ping(conn) — Проверяет соединение с сервером.
Не могу нигде найти библиотеку mysql. При использовании той, что у меня есть, получаю ошибку :(
attempt to call method 'ping' (a nil value)
 

Vespan

хинкали это большие пельмени
Проверенный
2,140
1,900
Можно ли управлять imgui.Selectable(или похожее) стрелочками
 

cort

Известный
244
98
как получить текст "Оплачен на дней" с диалога ? Если оплачен менее чем на 5 дней то отправлять сообщение в вк.

Lua:
token_vk = ''
groupid_vk = ''



if mode == 1 then
            mymsglol = "Сервер: "..server.." "..sampGetCurrentServerName().."\n\nНайден дом который оплачен менее чем на 5 дней. Координаты:  [ "..gorod.." ]
            requests.get("https://api.vk.com/method/messages.send?v=5.103&access_token="..token_vk.."&user_id="..user_id.."&message="..urlencode(u8:encode(mymsglol, 'CP1251')).."&group_id="..groupid_vk.."&random_id="..random(1111111111, 9999999999))
        elseif mode == 2 then
            mymsglol = "Сервер: "..server.." "..sampGetCurrentServerName().."\n\nНайден дом который оплачен менее чем на 5 дней. Координаты: [ "..gorod.." ]\n\nБотоводит:\n"..botovod
            requests.get("https://api.vk.com/method/messages.send?v=5.103&access_token="..token_vk.."&chat_id="..chat_id.."&message="..urlencode(u8:encode(mymsglol, 'CP1251')).."&group_id="..groupid_vk.."&random_id="..random(1111111111, 9999999999))

Screenshot_96.png
 

W H Y ?

Участник
103
8
Как сделать чтобы когда убиваешь чела играла песня по ссылке?
 

Corrygаn

Участник
225
6
Есть такие отыгровки. Почему-то в них пишутся не все отыгровки, а только 2, какой-то баг мб? Как исправить?
Lua:
--main
    sampRegisterChatCommand("su", cmd_su)
    sampRegisterChatCommand("ticket", cmd_ticket)

function cmd_su(arg)
    lua_thread.create(function()
        var1, var2, var3 = string.match(arg, "(.+) (.+) (.+)")
        if var3 == nil then
            sampAddChatMessage("Введите ID, уровень розыска, причину.", 0xFFFFFF)
        else
            sampSendChat("/do В руках находится КПК.")
            wait(3100)
            sampSendChat("/me зайдя в базу МВД, выбрал гражданина.")
            wait(3100)
            sampSendChat("/me объявил гражданина в розыск.")
            wait(3100)
            sampSendChat("/su " .. var1, var2, var3)
        end
    end)
end

function cmd_ticket(arg)
    lua_thread.create(function()
        var1, var2, var3 = string.match(arg, "(.+) (.+) (.+)")
        if var3 == nil then
            sampAddChatMessage("Введите ID, сумму, причину.", 0xFFFFFF)
        else
            sampSendChat("/do В руках находятся блокнот и ручка.")
            wait(3100)
            sampSendChat("/me начал записать протокол в блокнот.")
            wait(3100)
            sampSendChat("/do Протокол записан.")
            wait(3100)
            sampSendChat("/me вырвав протокол из блокнота, передал его гражданину.")
            wait(3100)
            sampSendChat("Будьте добры, оплатите на месте.")
            sampSendChat("/ticket " .. var1, var2, var3)
        end
    end)
end

Screenshot_20.png
Screenshot_21.png
 

Alkoigel

Участник
113
13
как эмулировать нажатие клавиши f8?
есть у меня такой вот кодик

Lua:
function thread_test(option)
    if option == "2" then
        sampSendChat("/me плюнул на пол")
        wait (1000)
        sampSendChat("/time")
    end
end
хочу просто чтобы бьыло примерно так:

Lua:
function thread_test(option)
    if option == "2" then
        sampSendChat("/me плюнул на пол")
        wait (1000)
        sampSendChat("/time")
        wait (1000)
        --автоматический скриншот
    end
end
 

Alkoigel

Участник
113
13
Есть такие отыгровки. Почему-то в них пишутся не все отыгровки, а только 2, какой-то баг мб? Как исправить?
Lua:
--main
    sampRegisterChatCommand("su", cmd_su)
    sampRegisterChatCommand("ticket", cmd_ticket)

function cmd_su(arg)
    lua_thread.create(function()
        var1, var2, var3 = string.match(arg, "(.+) (.+) (.+)")
        if var3 == nil then
            sampAddChatMessage("Введите ID, уровень розыска, причину.", 0xFFFFFF)
        else
            sampSendChat("/do В руках находится КПК.")
            wait(3100)
            sampSendChat("/me зайдя в базу МВД, выбрал гражданина.")
            wait(3100)
            sampSendChat("/me объявил гражданина в розыск.")
            wait(3100)
            sampSendChat("/su " .. var1, var2, var3)
        end
    end)
end

function cmd_ticket(arg)
    lua_thread.create(function()
        var1, var2, var3 = string.match(arg, "(.+) (.+) (.+)")
        if var3 == nil then
            sampAddChatMessage("Введите ID, сумму, причину.", 0xFFFFFF)
        else
            sampSendChat("/do В руках находятся блокнот и ручка.")
            wait(3100)
            sampSendChat("/me начал записать протокол в блокнот.")
            wait(3100)
            sampSendChat("/do Протокол записан.")
            wait(3100)
            sampSendChat("/me вырвав протокол из блокнота, передал его гражданину.")
            wait(3100)
            sampSendChat("Будьте добры, оплатите на месте.")
            sampSendChat("/ticket " .. var1, var2, var3)
        end
    end)
end

Посмотреть вложение 101123Посмотреть вложение 101124
Попробуй объявить поток в мэйне и через function theead_nameOfThread(option)
if option == "su" then
 

Smeruxa

smeruxa.ru
Проверенный
1,432
800
как эмулировать нажатие клавиши f8?
есть у меня такой вот кодик

Lua:
function thread_test(option)
    if option == "2" then
        sampSendChat("/me плюнул на пол")
        wait (1000)
        sampSendChat("/time")
    end
end
хочу просто чтобы бьыло примерно так:

Lua:
function thread_test(option)
    if option == "2" then
        sampSendChat("/me плюнул на пол")
        wait (1000)
        sampSendChat("/time")
        wait (1000)
        --автоматический скриншот
    end
end
либо функцию из полезных сниппетов, или
Lua:
setVirtualKeyDown(VK_F8, true)
setVirtualKeyDown(VK_F8, false)
 
  • Нравится
Реакции: Alkoigel

Dmitriy Makarov

25.05.2021
Проверенный
2,512
1,139
Есть ли возможность хукать сообщения с клиентской стороны? то есть, один скрипт отправил sampAddChatMessage, а другой его сразу видит.
Это вроде должно помочь:
Lua:
-- Беск. цикл
text, prefix, color, pcolor = sampGetChatString(99)
if text:find("Сообщение скрипта") then
    -- code
end
 
  • Нравится
Реакции: JustMini

W1ll04eison

Известный
330
19
Что делать если при запуске имгуи окна (инфобара) появляется курсор, как убрать эту функцию?

P.s в функции окна имгуи у меня стоит ShowCursor = false, но он все равно показывается
 

ROBERT PUSHER

Известный
305
221
Не понимаю как правильно передать и принять POST-запрос на сайт с никнеймом, отправляю так:
Lua:
function checkRenewal()
    local nick = sampGetPlayerNickname(select(2,sampGetPlayerIdByCharHandle(PLAYER_PED)))
    httpRequest('http://site/', nick, function(response, code, headers, status)
        print(response)
    end)
end
Принимаю так:
PHP:
<?php
    // error_reporting(0);

    $mysqli = new mysqli('site', 'mysql', 'mysql', 'site');
    if ($mysqli->connect_errno) {
        echo 'Не удалось подключиться к базе данных';
    }
    else {
        echo 'Подключение к базе данных произошло успешно. <br>';
        print_r($_POST);
    }
    $mysqli->close();
?>
Когда я оставляю print_r на php, то response с lua выводит мне принтом мой ник , а когда убираю print_r, то response на lua не выводит, притом что в обоих случаях на моём недообработчик-сайте ник не выводится.
 
Последнее редактирование:

Dashok.

Участник
228
9
Скрипт должен решать примеры, но он не работает, хелп
Примеры идут всегда со знаком +, но числа всегда разные

Lua:
function sampev.onServerMessage(color, text)
    if text:find("{FFA500}%[Викторина%] {FFFFFF}сколько будет {FFA500}(.+)?{FFFFFF}. Пишите ответ в чате!") then
        lua_thread.create(function() wait(10)
            local num = text:match("{FFA500}%[Викторина%] {FFFFFF}сколько будет {FFA500}(.+)?{FFFFFF}. Пишите ответ в чате!")
          sampSendChat(""..math(tostring(num)))
        end)
    end
end

function math(str)
    return assert(load("return " .. str))()
end

Само сообщение в чате;
sa-mp-023.png