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

kingleonides

Участник
43
28
Ребята ситуация такая. В LUA Нечего не понимаю, но сценарий очень надо.
Есть Lua сценарий для Game Guardians программа для редактирования адресов памяти на телефоне (Android). Этот сценарий защищён "Simple Encryption By Top GEO V9". Вот сам код , а так же прикреплённый файл ниже.
Как я понял протектор состоит из байт-кода, который переводит в строку, и после его запускает через load().
Я пытался использовать функции которые прилагаться в сценарии.
Пример:


Пример:
function Executer(bytes)
byte = '' for i in ipairs(bytes) do
byte = byte ..string.char(bytes[i])
end return byte end

Executer((arrayBYTE))

print(string.char(table.unpack(arrayBYTE)))

А так же результат пытался сохранить в txt но результат оставался таким же.
Всё что выдавало в консоль

Если кто сможет помочь большое спасибо.​
Распаковываешь таблицу символов, конвертирует в чары, сейвишь в файл и получаешь накрытый чем-то файл luac.
Как декомпилировать луак - не знаю, знают те которые этим занимаются, просто запихать его в декомпилятор смысла не имеет, там нечто обо что спотыкается декомпилятор и падает в краш, + еще версия файла, если мне не пиздит декомпилятор 5.4.
Раньше можно было подрезать хидер до какого-то символа - и спокойно декомпилировать.
Можно ли использовать несколько? if string.find?
Lua:
function sampev.onSendCommand(cmd)
    if string.find(cmd, '/b .+') then
        return {cmd..'.'}
    elseif string.find(cmd, "/fam .+") then
        return {cmd.."."}
    end
end
 
  • Нравится
Реакции: FForest и Fabregoo

savvin

Известный
407
140
Распаковываешь таблицу символов, конвертирует в чары, сейвишь в файл и получаешь накрытый чем-то файл luac.
Как декомпилировать луак - не знаю, знают те которые этим занимаются, просто запихать его в декомпилятор смысла не имеет, там нечто обо что спотыкается декомпилятор и падает в краш, + еще версия файла, если мне не пиздит декомпилятор 5.4.
Раньше можно было подрезать хидер до какого-то символа - и спокойно декомпилировать.

Lua:
function sampev.onSendCommand(cmd)
    if string.find(cmd, '/b .+') then
        return {cmd..'.'}
    elseif string.find(cmd, "/fam .+") then
        return {cmd.."."}
    end
end
зачем еще одна проверка, если действие внутри проверок одно и то же, or нельзя?
 

nedonowenniy

Участник
133
2
есть тхт файл с номерами домов и их координатами надо написать скрипт чтобы ведя номер дома на карте появилась метка на этих координатах, подскажите какие-функции отвечают за создании метки на карте, чтения данных из файла, и поиск номера в файле?
 

Eugene Crabs

Активный
544
30
есть тхт файл с номерами домов и их координатами надо написать скрипт чтобы ведя номер дома на карте появилась метка на этих координатах, подскажите какие-функции отвечают за создании метки на карте, чтения данных из файла, и поиск номера в файле?
Запись и чтение - вот. https://oojoo.ru/11-zapis-i-chtieniie-iz-faila/. (Только запись, к сожалению. Чтение есть в wayback machine, но без скриншотов с примерами) И да, возможно следует сделать чтобы на 1 строчке был 1 параметр. Как минимум мне так проще, хз как тебе. Остальное пока сам не изучал
 

Seetvek

Известный
22
1
Почему функция getDriverOfCar() выводит значения -1(когда водителя нет) и 1(когда водитель есть)? (ID машины указываю верно)

Lua:
function cmdTest(params)
    local result, vehicle_handle = sampGetCarHandleBySampVehicleId(tonumber(params)) -- возвращает handle по id
    local driverPed = getDriverOfCar(vehicle_handle) -- возвращает handle водителя по handle машины
    local driverId = sampGetPlayerIdByCharHandle(driverPed) -- возвращает id по handle водителя
    sampAddChatMessage(driverId,-1)
end
 
  • Нравится
Реакции: Voldmare

Eugene Crabs

Активный
544
30
Почему функция getDriverOfCar() выводит значения -1(когда водителя нет) и 1(когда водитель есть)? (ID машины указываю верно)

Lua:
function cmdTest(params)
    local result, vehicle_handle = sampGetCarHandleBySampVehicleId(tonumber(params)) -- возвращает handle по id
    local driverPed = getDriverOfCar(vehicle_handle) -- возвращает handle водителя по handle машины
    local driverId = sampGetPlayerIdByCharHandle(driverPed) -- возвращает id по handle водителя
    sampAddChatMessage(driverId,-1)
end
Так она работает наверное. Или в чем вопрос то?
 

Seetvek

Известный
22
1
Так она работает наверное. Или в чем вопрос то?
Она должна возвращать handle водителя машины, вместо этого она возвращает -1(когда водителя нет) и 1(когда водитель есть).
Или дайте другой способ получения ID водителя машины.
 

EmilkaL

Известный
85
5
что делать если комманда выполняется только в случае, если я пишу sampRegisterChatCommand в main while true do wait(0) sampRegisterChatCommand('cmd', cmd_func) end
 

savvin

Известный
407
140
что делать если комманда выполняется только в случае, если я пишу sampRegisterChatCommand в main while true do wait(0) sampRegisterChatCommand('cmd', cmd_func) end
ее нужно вызывать при старте скрипта, точней при старте сампа, а не несколько раз в секунду
 

3D shot

Новичок
8
2
Как найти значение клавиш для работы с памятью? к примеру "F8" это "0x119CBC". "0x" понятно почему. "119" это сам ид кнопки, но что такое "CBC" я так и не понял, а просто используя "0х13" или "0x13CBC" не работает.
 

EmilkaL

Известный
85
5
ее нужно вызывать при старте скрипта, точней при старте сампа, а не несколько раз в секунду
Не то спросил, ща протестил, проблема не в вызове комманды, а в имгуи, если команда как раз таки вне while true do, то тогда менюшка imgui не включается(
 

Vespan

loneliness
Проверенный
2,104
1,635
Как сделать,что когда я написал в .ini файл J (клавиша) то на эту клавишу (J) активировалось сообщение в чат
 

savvin

Известный
407
140
Не то спросил, ща протестил, проблема не в вызове комманды, а в имгуи, если команда как раз таки вне while true do, то тогда менюшка imgui не включается(
Проверяй на загрузку сампа, в самое начала main()

Lua:
    if not isSampfuncsLoaded() and not isSampLoaded() then return end
    while not isSampAvailable() do wait(0) end