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

asdzxcjqwe

¯\_(ツ)_/¯
Друг
621
704
Для luajit нельзя, можно дизассемблировать, но это мало что дает (с) FYP
Вбиваем в Гугл LuaJIT Decompiler, по запросу уже нашлось 2 рабочих декомпилятора.
Да, код на выходе говно, но всё же он более-менее понятный (даже табуляцию расставляет)
У mtasa норм обфускация, там структура файла полностью меняется
 
Последнее редактирование:

ynhhoJ

Известный
102
6
Может дать кто-нибудь пример использования опкодов из SF в LUA?
 

ynhhoJ

Известный
102
6
А смысл? Использование такое же самое, только для луа и надо либу подключать
Ну вот, хочу сделать штуку которая подбирает пикапа который находится в зоне стрима...
Нашел вот такой опкод: https://www.blast.hk/wiki/opcodes:0bd1
Но как его использовать под LUA, без понятия, посмотрел несколько примеров скриптов, в том числе и от FYP-a, но я не встречал у него исп. опкодов из SF...
 

itsLegend

Фонд борьбы за жуков 🐞
Администратор
2,695
1,448
Заходишь сюда (https://www.blast.hk/wiki/moonloader:functions) и в поиск таблицы вводишь опкод. Тебе покажут страницу, или хотя бы синтаксис функции.
 
  • Нравится
Реакции: ynhhoJ

ynhhoJ

Известный
102
6
Заходишь сюда (https://www.blast.hk/wiki/moonloader:functions) и в поиск таблицы вводишь опкод. Тебе покажут страницу, или хотя бы синтаксис функции.
Я знал что там есть опкоды, но не думал что от SF в том числе, т.е. с тем-же функционалом.
Спасибо.
 

kmsfax

Известный
154
89
Код:
function sampev.onPlayerStreamIn(playerId, team, model, posX, posY, posZ, rotation, color, fightingStyle)
    sampAddChatMessage(string.format("Игрок под ID: %d появился в зоне стрима. Модель: %d.", playerId, model), 0xFFFFFF)
end
Возможно как-то обновить инфу о игроке в зоне стрима (которая выше), не выходя из неё?
Надеюсь что объяснил понятно.
 

itsLegend

Фонд борьбы за жуков 🐞
Администратор
2,695
1,448
Почему, даже когда я применил проверку (если переменная не ровняется 0), все равно если она ровняется 0, выводится пустая строка.
Lua:
if test ~= nil then sampAddChatMessage(test, 0xffffff) end
Значит test не равен nil.
Nil и 0 разные вещи.

Возможно как-то обновить инфу о игроке в зоне стрима (которая выше), не выходя из неё?
Надеюсь что объяснил понятно.
https://www.blast.hk/threads/14624/
 

Xtonay

Известный
2
0
Привет дорогие друзья. У меня есть такой вопрос.

Как сделать в команде функции переменную.
Lua:
function main()
  if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
        sampRegisterChatCommand("test", testfunc)
        sampRegisterChatCommand("met", metfunc)
    while true do
        wait(0)
    end
end

function metfunc()
    if activate == 1 then
        sampSendChat("/me открыл склад с металлом ")
    wait(1)
        sampSendChat("/me взял металлическую заготовку")
        sampSendChat("/takem", q)
    wait(1)
        sampSendChat("/me закрыл склад с металлом")
    elseif activate == 0 then
        sampAddChatMessage("{704214}[AHK MO] {bdbdbd}Для работы этой команды , активируйте программу - {ffffff}/test", 0xbdbdbd)
    end
end
Получается мне нужно сделать так: /met Значение
и дальше следует код , а где /takem мне надо что бы туда ввело значение. К примеру. : /met 6 = /takem 6
 
Последнее редактирование:

Nekroch

Новичок
1
0
Здравствуйте. Я хотел спросить как вы исправляете такую ситуацию когда у вас клавиша "залипает"?
Допустим я нажал Alt+W - скрипт заработал машина увеличивает скорость. Свернул игру.
Развернул , нажал на W и машина всё равно увеличивает хотя Alt не нажат, но если на него нажать и отпустить то опять всё работает нормально.

Вот код если будет нужен:
Lua:
function main()
                                                                if not isSampfuncsLoaded() or not isSampLoaded() then return end
                                                                        while not isSampAvailable() do wait(100) end
                                                                    while true do
                                                                    wait(0)
                                                                    if not isPauseMenuActive() and isPlayerPlaying(playerHandle) and isGameWindowForeground() then
                                                                                if isKeyDown(VK_MENU) and isKeyDown(VK_W) then
                                                                                  speedHK()                                                                               
                                                                                end
                                                                                end
                                                                            end
                                                                        end
            function speedHK()
                if isCharInAnyCar(playerPed) then
                    local car = storeCarCharIsInNoSave(playerPed)
                    local speedcar = getCarSpeed(car)
                    setCarForwardSpeed(car, speedcar + 1)
                    printStringNow(speedcar, 2)
                end
            end