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

Biuti

Участник
165
8
как найти тексдрав по ид и цвету и выполнить какое-то действие?
 
Можно как-то определить что за карты?
1597045959700.png
 

Fott

Простреленный
3,431
2,270
Как сделать так, чтобы после ввода команды, начинался рендер прямоугольника на экране?
Lua:
function main()
while not isSampAvailable() do wait(0) end wait(1)
    sampRegisterChatCommand("rend", rend)
    while true do
    wait(0)
        if enabled then
            renderDrawBox(10, 15, 200, 80, 0xAA00CC00)
        end
    end
end

function rend(noArg)
enabled = not enabled
sampAddChatMessage(enabled and 'ON' or 'OFF', -1)
end
 
  • Нравится
Реакции: HpP

Karvies

Известный
16
1
Помогите пожалуйста, как сделать чтобы после высвечивания диалога функция ставилась на паузу и чтобы после повторного прописывания команды включалась. Тоесть у меня я прописываю команду, после появления в чат логе строчки пишет в чат команду.

Код:
require "lib.moonloader"
require "lib.sampfuncs"


local SE = require "lib.samp.events"
local main_color = 0x5A90CE
local keys = require "vkeys"


function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    
    sampAddChatMessage("[RepCapture] Скрипт подгружен.", 0xFFFFFF)
end


function main()
    while not isSampAvailable() do wait(0) end
    sampRegisterChatCommand("ar", capture_report)
end


function capture_report(arg)
    report = not report
end


function SE.onServerMessage(color, text)
    if report then
        if text:find("%[Жалоба%] от .+:") then
            sampSendChat(string.format('/ot', text))
        end
    end
end
 

Fott

Простреленный
3,431
2,270
Помогите пожалуйста, как сделать чтобы после высвечивания диалога функция ставилась на паузу и чтобы после повторного прописывания команды включалась. Тоесть у меня я прописываю команду, после появления в чат логе строчки пишет в чат команду.

Код:
require "lib.moonloader"
require "lib.sampfuncs"


local SE = require "lib.samp.events"
local main_color = 0x5A90CE
local keys = require "vkeys"


function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
  
    sampAddChatMessage("[RepCapture] Скрипт подгружен.", 0xFFFFFF)
end


function main()
    while not isSampAvailable() do wait(0) end
    sampRegisterChatCommand("ar", capture_report)
end


function capture_report(arg)
    report = not report
end


function SE.onServerMessage(color, text)
    if report then
        if text:find("%[Жалоба%] от .+:") then
            sampSendChat(string.format('/ot', text))
        end
    end
end
Не совсем понял что ты хочешь, и зачем тебе 2 main`a, но походу тебе нужно написать break там где должен быть стоп
 
  • Нравится
Реакции: Karvies

Karvies

Известный
16
1
Не совсем понял что ты хочешь, и зачем тебе 2 main`a, но походу тебе нужно написать break там где должен быть стоп
Когда открывается диалоговое окно, работа скрипта приостанавливается, чтобы когда принял репорт, и обрабатываешь его, другой не взялся.
 

Fott

Простреленный
3,431
2,270
Когда открывается диалоговое окно, работа скрипта приостанавливается, чтобы когда принял репорт, и обрабатываешь его, другой не взялся.
В коде ниже после репорта report = false, тоесть больше сообщения в чате искать не будет до тех пор, пока ты его не включишь снова командой активации
Lua:
require "lib.moonloader"
require "lib.sampfuncs"


local SE = require "lib.samp.events"
local main_color = 0x5A90CE
local keys = require "vkeys"


function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand("ar", capture_report)
    sampAddChatMessage("[RepCapture] Скрипт подгружен.", 0xFFFFFF)
     while true do
        wait(0)
    end
end


function capture_report(arg)
    report = not report
end


function SE.onServerMessage(color, text)
    if report then
        if text:find("%[Жалоба%] от .+:") then
            sampSendChat(string.format('/ot', text))
            report = false
        end
    end
end
 
Последнее редактирование:
  • Нравится
Реакции: Karvies и r0den

Karvies

Известный
16
1
В коде ниже после репорта report = false, тоесть больше сообщения в чате искать не будет до тех пор, пока ты его не включишь снова командой активации
Lua:
require "lib.moonloader"
require "lib.sampfuncs"


local SE = require "lib.samp.events"
local main_color = 0x5A90CE
local keys = require "vkeys"


function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand("ar", capture_report)
    sampAddChatMessage("[RepCapture] Скрипт подгружен.", 0xFFFFFF)
     while true do
        wait(0)
        end
    end
end


function capture_report(arg)
    report = not report
end


function SE.onServerMessage(color, text)
    if report then
        if text:find("%[Жалоба%] от .+:") then
            sampSendChat(string.format('/ot', text))
            report = false
        end
    end
end
Смотри, ты сделал чтобы после использования команды она отключалась, нужно сделать чтобы после открытия диалогового окна только тогда она отключалась, если диалогового окна не было, она не должна отключаться.
 

Fott

Простреленный
3,431
2,270
Смотри, ты сделал чтобы после использования команды она отключалась, нужно сделать чтобы после открытия диалогового окна только тогда она отключалась, если диалогового окна не было, она не должна отключаться.
Ok
Lua:
local SE = require "lib.samp.events"
local main_color = 0x5A90CE
local keys = require "vkeys"


function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand("ar", capture_report)
    sampAddChatMessage("[RepCapture] Скрипт подгружен.", 0xFFFFFF)
     while true do
        wait(0)
    end
end


function capture_report(arg)
    report = not report
end


function SE.onServerMessage(color, text)
    if report then
        if text:find("%[Жалоба%] от .+:") then
            sampSendChat(string.format('/ot', text))
        end
    end
end
function SE.onShowDialog(dialogId, style, title, button1, button2, text)
    if dialogId == 228 then -- вместо 228 ид диалога
        report = false
    end
end
 
  • Нравится
Реакции: Karvies

Enlizmee

Активный
471
100
возможно ли как то отследить что вписал игрок в диалог?буди не разрабом или админом
 

S-Sirius

Известный
353
21
Короче, писал чат на ВК API, для общения с друзей независимо от сервера, но есть проблема, когда в чат отправляется "xD" то в игру оը возвращает " ", то есть вместо "xD" отображается просто пробел. Как можно это исправить? (Использую LongPollAPI)
 

HpP

Известный
368
117
Можно ли, сделать так, чтобы если переменная, к примеру: stonks, меньше нуля, тогда она краситься в красный цвет, а если больше то в зеленый.
 

Fott

Простреленный
3,431
2,270
Можно ли, сделать так, чтобы если переменная, к примеру: stonks, меньше нуля, тогда она краситься в красный цвет, а если больше то в зеленый.
как пример пойдет
Lua:
function getStrByMawina(mawina)
    if mawina < 51 then
        return string.format("{006300}%d{ffffff}", mawina) -- темно зеленый
    elseif mawina < 80 and mawina > 51 then
        return string.format("{ff8533}%d{ffffff}", mawina) -- оранжевый
    elseif mawina > 80 then
        return string.format("{BF0000}%d{ffffff}", mawina) -- красный
    end
end
function tes(arg)
  sampAddChatMessage(getStrByMawina(mawina))
end
 
  • Нравится
Реакции: HpP