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

zwhoz

Известный
106
11
Как получить адекватные значения из функции bool result = isCarPassengerSeatFree(Vehicle car, int seat)?
Я не могу понять как оно работает...
 

ufdhbi

Известный
Проверенный
1,459
866
Как получить адекватные значения из функции bool result = isCarPassengerSeatFree(Vehicle car, int seat)?
Я не могу понять как оно работает...
Функция возвращает true если на указанном месте [1-4] в указанной машине сидит пассажир
false если его там нет
 

zwhoz

Известный
106
11
Функция возвращает true если на указанном месте [1-4] в указанной машине сидит пассажир
false если его там нет
Прикол в том что оно не так выводит как нужно.
Я проверял, садился за руль выводило 0 и 1 место True, потом на пассажирском переднем 1 место True и т.д. только три места показывало 0,1,2.
Если садился ещё кто-то то выводило ещё по другому, иногда даже не менялось. Переседал в другую машину там иначе показывало. Я хз как норм объяснить, но оно не так работает как надо.
 

FYP

Известный
Автор темы
Администратор
1,763
5,906
Прикол в том что оно не так выводит как нужно.
Я проверял, садился за руль выводило 0 и 1 место True, потом на пассажирском переднем 1 место True и т.д. только три места показывало 0,1,2.
Если садился ещё кто-то то выводило ещё по другому, иногда даже не менялось. Переседал в другую машину там иначе показывало. Я хз как норм объяснить, но оно не так работает как надо.
попробуй предварительно проверять, есть ли в машине вообще пассажиры, это может быть багом опкода.
bool result, int passengers = getNumberOfPassengers(Vehicle car)
int maxPassengers = getMaximumNumberOfPassengers(Vehicle car)
 

zwhoz

Известный
106
11
попробуй предварительно проверять, есть ли в машине вообще пассажиры, это может быть багом опкода.
bool result, int passengers = getNumberOfPassengers(Vehicle car)
int maxPassengers = getMaximumNumberOfPassengers(Vehicle car)
Проверял, тоже самое. Получить число пассажиров могу, но мне нужно узнать какие места занятые.
И ещё одно statustire = isCarTireBurst(car, tire) пробито одно колесо, выводит что два пробитых.

bool result, int passengers = getNumberOfPassengers(Vehicle car) - иногда выдаёт правду когда в машине нет пасажиров, но число пасажиров выводит правильно.
 
Последнее редактирование:

itsLegend

Фонд борьбы за жуков 🐞
Администратор
2,696
1,468
Проверял, тоже самое. Получить число пассажиров могу, но мне нужно узнать какие места занятые.
И ещё одно statustire = isCarTireBurst(car, tire) пробито одно колесо, выводит что два пробитых.

bool result, int passengers = getNumberOfPassengers(Vehicle car) - иногда выдаёт правду когда в машине нет пасажиров, но число пасажиров выводит правильно.
Все функции, которые у тебя по какой-то причине не работают, прекрасно осуществляют своё предназначение у меня.
Lua:
function main()
    while true do
        wait(0)
        if isCharInAnyCar(playerPed) then
            local car = storeCarCharIsInNoSave(playerPed)
            local result, passengers = getNumberOfPassengers(car)
            if result then sampAddChatMessage('Total passengers: ' .. passengers, -1) end

            local maxPassengers = getMaximumNumberOfPassengers(car)
            if maxPassengers > 0 then
                for i = 0, maxPassengers-1 do
                    sampAddChatMessage('Seat #' .. i .. ' is ' .. (isCarPassengerSeatFree(car, i) and 'Free' or 'Busy'), -1)
                end
            end

            wait(2000)
        end
    end
end

Lua:
function main()
    while true do
        wait(0)
        if isCharInAnyCar(playerPed) then
            local tires = 4

            local car = storeCarCharIsInNoSave(playerPed)
            if isCharOnAnyBike(playerPed) then
                tires = 2
            end

            for i = 0, tires-1 do
                if isCarTireBurst(car, i) then
                    sampAddChatMessage(i .. ' is burst', -1)
                end
            end

            wait(2000)
        end
    end
end
 
  • Нравится
Реакции: zwhoz

inf

Известный
77
89
Проверял, тоже самое. Получить число пассажиров могу, но мне нужно узнать какие места занятые.
И ещё одно statustire = isCarTireBurst(car, tire) пробито одно колесо, выводит что два пробитых.

bool result, int passengers = getNumberOfPassengers(Vehicle car) - иногда выдаёт правду когда в машине нет пасажиров, но число пасажиров выводит правильно.

у меня тоже работают нормально
Lua:
function tryEject(seat)
    local car = nil
    if isCharInAnyCar(playerPed) then
        car = storeCarCharIsInNoSave(playerPed)
    end
    if car and getDriverOfCar(car) == playerPed then
        local passenger = nil
        if not isCarPassengerSeatFree(car, seat) then
            passenger = getCharInCarPassengerSeat(car, seat)
        end
        if passenger then
            local r, id = sampGetPlayerIdByCharHandle(passenger)
            if r then sampSendChat(string.format("/eject %d", id)) end
        end
    end
end
 

zwhoz

Известный
106
11
Все функции, которые у тебя по какой-то причине не работают, прекрасно осуществляют своё предназначение у меня.
Lua:
function main()
    while true do
        wait(0)
        if isCharInAnyCar(playerPed) then
            local car = storeCarCharIsInNoSave(playerPed)
            local result, passengers = getNumberOfPassengers(car)
            if result then sampAddChatMessage('Total passengers: ' .. passengers, -1) end

            local maxPassengers = getMaximumNumberOfPassengers(car)
            if maxPassengers > 0 then
                for i = 0, maxPassengers-1 do
                    sampAddChatMessage('Seat #' .. i .. ' is ' .. (isCarPassengerSeatFree(car, i) and 'Free' or 'Busy'), -1)
                end
            end

            wait(2000)
        end
    end
end
у меня тоже работают нормально
Lua:
function tryEject(seat)
    local car = nil
    if isCharInAnyCar(playerPed) then
        car = storeCarCharIsInNoSave(playerPed)
    end
    if car and getDriverOfCar(car) == playerPed then
        local passenger = nil
        if not isCarPassengerSeatFree(car, seat) then
            passenger = getCharInCarPassengerSeat(car, seat)
        end
        if passenger then
            local r, id = sampGetPlayerIdByCharHandle(passenger)
            if r then sampSendChat(string.format("/eject %d", id)) end
        end
    end
end


Lua:
function main()
    while true do
        wait(0)
        if isCharInAnyCar(playerPed) then
            local tires = 4

            local car = storeCarCharIsInNoSave(playerPed)
            if isCharOnAnyBike(playerPed) then
                tires = 2
            end

            for i = 0, tires-1 do
                if isCarTireBurst(car, i) then
                    sampAddChatMessage(i .. ' is burst', -1)
                end
            end

            wait(2000)
        end
    end
end

Я что-то не то намутил значит. Спасибо!
 

cd9158763

Новичок
1
0
Появилась проблема - в одной игре внутренние скрипты после обновления приобрели расширения .luac32 и .luac64 и, естественно, перестали читаться через блокнот. Из гугла я понял, что для них нужен декомпилятор, а вот найти его не смог. Случайно наткнулся на эти
Софт - LuaJIT 2.0.5 Compiler(https://blast.hk/threads/17276/)
Есть ли декриптор Luac файлов?(https://blast.hk/threads/17363/#post-150250) темы на знакомом форуме, но софт оттуда также не дал результата (возможно, я неправильно его использовал, т.к. скрипт из ОПпоста второго топика также отказался открываться). Как вы уже поняли, мне требуется только прочитать содержимое, а не запускать/изменять его. Прошу знающих отписаться, возможно ли вообще что-то сделать или сразу начинать искать другие способы копания данных.
Прикрепил архив с примером одного файла в старом и текущем виде.
 

Вложения

  • scripts.zip
    83.6 KB · Просмотры: 18
Последнее редактирование:

TheWille

Участник
43
4
Каким образом можно прочитать определенную строчку из файлу и вынести ее в переменную? Искал, но что-то не нашел, помогите. Имею в виду строчку под определенным номер, третью например.
 
Последнее редактирование:

zwhoz

Известный
106
11
Как получить цвет кара в ARGB? getCarColours - ид цвета выводит.
 
Последнее редактирование:

манку хлебал

Потрачен
305
122
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Всем привет, хотелось бы написать скрипт - автобусник для дрп, и вот.... Нужно как то заставить машину ехать) С персонажем все легче, в паблике есть функция BeginToPoint, есть ли что-то такое для машин?
 

FYP

Известный
Автор темы
Администратор
1,763
5,906
Появилась проблема - в одной игре внутренние скрипты после обновления приобрели расширения .luac32 и .luac64 и, естественно, перестали читаться через блокнот. Из гугла я понял, что для них нужен декомпилятор, а вот найти его не смог. Случайно наткнулся на эти
Софт - LuaJIT 2.0.5 Compiler(https://blast.hk/threads/17276/)
Есть ли декриптор Luac файлов?(https://blast.hk/threads/17363/#post-150250) темы на знакомом форуме, но софт оттуда также не дал результата (возможно, я неправильно его использовал, т.к. скрипт из ОПпоста второго топика также отказался открываться). Как вы уже поняли, мне требуется только прочитать содержимое, а не запускать/изменять его. Прошу знающих отписаться, возможно ли вообще что-то сделать или сразу начинать искать другие способы копания данных.
Прикрепил архив с примером одного файла в старом и текущем виде.
судя по всему, они зашифрованы и может быть даже не скомпилированы вовсе. декомпилятор в этом случае точно не поможет, нужен декриптор.
 

AnWu

https://t.me/anwublog
Всефорумный модератор
4,761
5,368
Возможно ли "заблокировать" отправку нажатой клавиши игре? Например чтобы на F6 чат не открывалс, или на Escape не открывалось меню паузы

Вопрос еще один. Как получить текущий ID скина персонажа?
 
Последнее редактирование: