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

BlackGoblin

Известный
519
215
Ничего не маленький! Просто там холодной... Ой. В общем то я не понимаю что ты хочешь сделать, и есть ли у тебя Somson? Если да, то уверен ли ты что он так называется? Через Word проверь.
Нужно чтобы так же выводилось на экран. В том же месте, тем же размером, выводит вообще левый шрифт. И да, samson - шрифт скачанный, не оригинальный из винды, но оно даже оригинальные из десятки не определяет почти.
 

Вложения

  • Screenshot_5.jpg
    Screenshot_5.jpg
    196.5 KB · Просмотры: 215
  • Screenshot_6.jpg
    Screenshot_6.jpg
    17.8 KB · Просмотры: 210

AnWu

Guardian of Order
Всефорумный модератор
4,699
5,221
Lua:
if title:find("Капча") then
           if capVoice ~= 0 then
               if capState then
                   bass.BASS_ChannelPlay(capVoice, false)
                   botE()
               end
           end
.
С басс всё не так однозначно. Не работал. И нет желания разбираться.
Нужно чтобы так же выводилось на экран. В том же месте, тем же размером, выводит вообще левый шрифт. И да, samson - шрифт скачанный, не оригинальный из винды, но оно даже оригинальные из десятки не определяет почти.
Тебе эти цифры сервер присылает?
 

Grenkos

Известный
11
1
1. Нужно ли обнулять глобальные переменные?
2. Возможна ли утечка памяти и как ее обнаружить и избежать?

Пишу скрипт, довольно объёмный, функций много. Начал происходить краш во время игры и после попытки войти в гта - на моменте загрузки краш вылетает сразу. Грешу на связь с вышеперечисленными вопросами
 

James Hawk

Известный
919
217
Мб кто-то шарит. Проверяю наличие ТД и делаю клик. При нажатии на ТД появляется ещё один ТД (на скрине видно: на аризоне клацаешь по сундуку и нужно выбрать, что сделать с ним). По первому ТД кликаю нормально (то бишь, по сундуку), по второму ТД клика нет (в данном случае, вариант "use")
Lua:
if sampTextdrawIsExists(2118) then
                    sampSendClickTextdraw(2118)
                    if sampTextdrawIsExists(2201) then
                        sampSendClickTextdraw(2201)
                    end
                end
NzpVijs.png
ZF5VBwG.png
 

madrasso

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

trefa

Известный
Всефорумный модератор
2,097
1,233
1. Нужно ли обнулять глобальные переменные?
2. Возможна ли утечка памяти и как ее обнаружить и избежать?

Пишу скрипт, довольно объёмный, функций много. Начал происходить краш во время игры и после попытки войти в гта - на моменте загрузки краш вылетает сразу. Грешу на связь с вышеперечисленными вопросами
Нет, в луа есть сборщик мусора.
 

Данекк

Известный
39
0
в чём может быть проблема, при активации скрипта такая штука
 

Вложения

  • Безымянный.png
    Безымянный.png
    6.1 KB · Просмотры: 224

Di3

Участник
432
20
а отправка сообщений возможно быстрее чем через sampSendChat() ?
Если да,то как.
 

Salvatore_Ferrari

Известный
427
239
в чём может быть проблема, при активации скрипта такая штука
Косяк где то в имгуи.

А для чего поток нужен,какую роль играет?
Поток значит выполнить какой-то поток отдельно , например , если ты в main описал огроменную фунция которая содержить 10000строк , то только после выполнения этой фунции выполнится следующий кусок кода, если функция отработает через 2секунды , то логично следующая команда выполнится раз в 2 секунды(например вывод сообщение) лучше эту огроменную фунцию передать отдельному потоку , чтобы вызов фунции выполнялся в отдельному потоке в то время как основной поток спокойно будет выводить сообщение и не ждать выполнение функции.
 

#Northn

Police Helper «Reborn» — уже ШЕСТЬ лет!
Всефорумный модератор
2,638
2,488
в чём может быть проблема, при активации скрипта такая штука
Косяк где то в имгуи.


Поток значит выполнить какой-то поток отдельно , например , если ты в main описал огроменную фунция которая содержить 10000строк , то только после выполнения этой фунции выполнится следующий кусок кода, если функция отработает через 2секунды , то логично следующая команда выполнится раз в 2 секунды(например вывод сообщение) лучше эту огроменную фунцию передать отдельному потоку , чтобы вызов фунции выполнялся в отдельному потоке в то время как основной поток спокойно будет выводить сообщение и не ждать выполнение функции.
После всего рендера:
Lua:
imgui.End()
 

Danik)

Участник
28
2
8ю строку скинь


Создавай поток в хуке


Lua:
function main()
    repeat wait(0) until isSampAvailable()
    sampRegisterChatCommand("cid", function(param)
        if tonumber(param) ~= nil then
            if sampIsPlayerConnected(param) then
                local result, ped = sampGetCharHandleBySampPlayerId(param)
                if result then
                    if isCharInAnyCar(ped) then
                        local car = storeCarCharIsInNoSave(ped)
                        local _, int_id = sampGetVehicleIdByCarHandle(car)
                        sampAddChatMessage(int_id,0xffcecece)
                    else
                        sampAddChatMessage("Игрок не в машине",0xffcecece)
                    end
                else
                    sampAddChatMessage("Игрок вне зоны стрима.",0xffcecece)
                end
            else
                sampAddChatMessage("Такого игрока нет.",0xffcecece)
            end
        else
            sampAddChatMessage("Используй: /cid [id игрока]",0xffcecece)
        end
    end)
    wait(-1)
end
В данный момент требуется, чтобы в 11 строке вводилась команда (а не просто сообщение) и после команды через пробел вводился ID машины. (Привет: /test CarID). Сколько бы не пробовал, всё не получается, можете помочь?